我有一个班级:
public abstract class Foo{
@Inject
private FooBarClient foobarclient;
public abstract long dofoo1();
public abstract long dofoo2();
public void doBar1(){
foobarClient.docall(faa);
}
}
我想测试doBar1()方法,所以我像这样制作了我的测试类:
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
private Foo foo;
@Mock
private FoobarClient foobarClient;
@Before
public void init() {
foo = new Foo() {
dofoo1(){};
};
}
@Test
public void testControleValiditeSite() throws Exception {
// G
Response response=....;
Mockito.when(foobarClient.docall(Mockito.any(faa.class))).thenReturn(
response);
// W
foo.doBar1();
// T;
}
但是我在doBar1()中的fooBarclient上得到了一个空指针异常。
我还尝试用以下方式模拟摘要:
Foo foo = Mockito.mock(Foo,Mockito.CALLS_REAL_METHODS);
有没有更好的方法来进行此测试?
编辑:
我用过反射。现在代码如下:
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
private Foo foo;
@Mock
private FoobarClient mockedFoobarClient;
@Before
public void init() {
foo = new Foo() {
dofoo1(){};
};
**MockitoAnnotations.initMocks(this);**
**ReflectionTestUtils.setField(foo , "foobarClient", mockedFoobarClient);**
}
@Test
public void testControleValiditeSite() throws Exception {
// G
Response response=....;
Mockito.when(foobarClient.docall(Mockito.any(faa.class))).thenReturn(
response);
// W
foo.doBar1();
// T;
}
答案 0 :(得分:1)
您可能不需要模拟它,只需在测试中创建一个实例(假设您能够将客户端的访问类型从private
更改为protected
)。
Foo foo = new Foo() {
@Override
public long dofoo1() {
return 0;
}
@Override
public long dofoo2() {
return 0;
}
public void setClient(FooBarClient client) {
foobarclient = client;
}
};
foo.setClient(client);
foo.doBar1();
答案 1 :(得分:0)
在您的测试类中,创建一个扩展Foo
的非抽象内部类。在测试中使用它。