我想测试这个使用匿名类调用接口方法的类。
public class ClassToTest
{
public void methodToTest()
{
InterefaceToMock interefaceToMockReference = new InterefaceToMock() {
@Override
public int methodToMock()
{
return 0;
}
};
interefaceToMockReference.methodToMock();
}
}
这是界面
public interface InterefaceToMock
{
public int methodToMock();
}
我正在使用这个approch来检查它是否调用了methodToMock
import static org.junit.Assert.*;
import org.junit.Test;
import mockit.FullVerificationsInOrder;
import mockit.Mocked;
import mockit.NonStrictExpectations;
public class TestAClass
{
@Mocked InterefaceToMock interefaceToMockReferenceMocked;
@Test
public void test1()
{
new NonStrictExpectations()
{
{
interefaceToMockReferenceMocked.methodToMock();times=1;
}
};
(new ClassToTest()).methodToTest();
new FullVerificationsInOrder(interefaceToMockReferenceMocked)
{
};
assertTrue(true);
}
}
但是测试用例失败了。 任何人都可以提供帮助。
答案 0 :(得分:1)
您的原始测试几乎是正确的。它声明模拟字段只是@Mocked
,它只是给你一个实现接口的模拟实例,而这不是被测代码所使用的实例。但是,JMockit API具有另一个模拟注释,它将模拟扩展到给定基类型的所有实现类,并且默认情况下会影响所述类的所有实例。因此,测试应更改如下:
public class TestAClass
{
@Capturing InterfaceToMock anyImplementingInstance;
@Test
public void test1()
{
new ClassToTest().methodToTest();
new Verifications() {{
anyImplementingInstance.methodToMock();
}};
}
}
答案 1 :(得分:0)
在一般情况下,如果您有class
,并且想要检查是否调用Mock
的{{1}}上的方法,则使用class
。
例如:
Mockito.verify
此处,测试是public class AppTest {
@Test
public void testMe() {
final ITest iTest = Mockito.mock(ITest.class);
final CUT cut = new CUT(iTest);
cut.doStuff();
Mockito.verify(iTest).someStuff();
}
interface ITest {
void someStuff();
}
class CUT {
private final ITest iTest;
CUT(ITest iTest) {
this.iTest = iTest;
}
public void doStuff() {
iTest.someStuff();
}
}
}
是否调用ITest.someStuff()
。
你的例子是难以理解的......