Java 测试包含接口调用的抽象类的具体方法
我有一门课:Java 测试包含接口调用的抽象类的具体方法,java,junit,mockito,Java,Junit,Mockito,我有一门课: public abstract class Foo{ @Inject private FooBarClient foobarclient; public abstract long dofoo1(); public abstract long dofoo2(); public void doBar1(){ foobarClient.docall(faa); } } 我想测试doBar1()方法,所以我的测试类如下: @RunWith(Mock
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;
}
您可能不需要模拟它,只需在测试中创建一个实例(假设您能够将客户端的访问类型从
private
更改为protected
)
在测试类中,创建一个扩展
Foo
的非抽象内部类。在测试中使用该选项。您好,很不幸,我无法使用set():/您可以将客户端的访问类型更改为protected而不是private吗?您好,我的问题在于intarface调用。不是抽象的。关于,您如何在创建的foo
实例中设置foobarclient
?我认为Mockito
运行程序不支持@Inject
注释。要么显式设置它,要么使用@InjectMocks
I modifiedcode
@Mock private FoobarClient FoobarClient;模仿。我调用了实现,而不是接口,但是现在Mockito.when(…)不匹配。关于,@InjectMocks将是foo
上的注释,而不是FooBarClient
。我建议只做foo.foobarclient=foobarclient代码>或调用setter方法。使用Spring的ReflectionTestUtils进行设置。
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();