我有,例如,这个类:
public class A {
private List<String> list;
public A(B b){
list = b.getList();
}
public List<String> someMethod(){
return list;
}
}
我想单元测试someMethod
而不调用构造函数。 我使用反射来设置list
。
问题是,我不希望创建B
类的对象,我不能嘲笑它,因为它会导致NPE。
所以我的问题是:
如何测试someMethod
不调用的构造A
? 有没有什么办法来模拟A类和不输posibility调用方法?
零个参数的构造函数创建是不是一个解决方案。
注:我不想改变类的任何部分。 我问,如果它能够在不追加,变更类的任何执行此测试。
您可以测试A类,而不调用它的构造器的Mockito。 不知道如果我真的能理解你的要求,但下面的代码为我工作。
import org.junit.Test;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.ArrayList;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class ATest {
@Test
public void test() {
A a = mock(A.class);
when(a.someMethod()).thenCallRealMethod();
List<String> listInA = new ArrayList<String>();
ReflectionTestUtils.setField(a, "list", listInA);
assertThat(a.someMethod(), is(listInA));
}
}
你应该模拟出的合作者类 - 这意味着你可以创建的类被测试的实例,并通过在嘲笑,配置为“做正确的事”时,它的方法被调用。
在你的榜样,你要创建一个模拟B,并使用它像这样:
@RunWith(MockitoJUnitRunner.class)
class myTest {
@Mock private B b;
public void someMethod() {
doReturn(new ArrayList<String>()).when(b).getList();
A a = new A(b);
assertEquals("result", a.someMethod().get(0));
}
}
我不希望创建B级对象
加入这不需要B.构造函数或工厂方法
public A(B b){
this(b.getList());
}
/* package local */ A(List<String> list){
this.list = list;
}
通过使构造包当地可以通过单元测试在同一个包进行访问。
如何在不调用构造函数的测试的someMethod?
您可以使用
A a = theUnsafe.allocateInstance(A.class);
但不建议这样做,除非你有没有其他选择,例如反序列化。