我的MainActivity
(Android)中有一个方法,我想模拟A
实例:
public void some_method() {
A a = new A();
....
}
所以我创建了一种工厂类
public class SomeFactory(){
// some constructor
public A populateWithParameter(Parameter parameter){
return new A(parameter)
}
}
并且上述方法变为
public void some_method(SomeFactory someFactory) {
A a = someFactory.populateWithParameter(parameter);
a.method_call()
....
}
我试过这个
@Mock
SomeFactory someFactory;
public void testSomeMethod() throws Exception {
SomeFactory someFactory = new SomeFactory();
when(someFactory.populateWithParameter(
some_parameter)).thenReturn(null);
mainActivity.some_method(someFactory);
...
}
但是我收到此错误消息
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
答案 0 :(得分:1)
你不是在嘲笑你的工厂。另外,方法调用错误。
改为做。
SomeFactory someFactory = mock(SomeFactory.class)
when(someFactory.populateWithParameter(
some_parameter)).thenReturn(null);
mainActivity.some_method(someFactory);
<强>更新强>
您的代码已更改,因此为了完整性,这是您的测试应该是什么样子。在上面的更新代码中,您使用真实对象覆盖了mock
。假设您的对象设置正确。请注意提供返回对象的不同语法。我认为这更具可读性。
@Mock SomeFactory mockFactory;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this); // set up annotated mocks
}
@Test
public void testSomeMethod() {
A subject = new A();
doReturn(subject).when(mockFactory)
.populateWithParameter(any(Parameter.class));
main_activity.some_method(mockFactory);
verify(mockFactory,times(1)).populateWithParameter(any(Parameter.class));
}
最佳做法
main_activity
变为MainActivity
,some_method
变为SomeMethod
。答案 1 :(得分:0)
您需要一种方法来覆盖测试中A
的实例。通常,这是使用注射框架完成的。对于一个简单的情况,您可以使测试字段protected
(假设测试类与测试中的类位于同一个包中)。
您看到的错误会与“真实”对象进行交互,就好像它是模拟对象一样。
在这种情况下,SomeFactory
是一个真实的对象,因此它不能是when()ed
答案 2 :(得分:0)
从@ DiscoS2的回应来看,这个声明确实存在问题
MockitoAnnotations.initMocks(this);
您应该使用SomeFactory someFactory = mock(SomeFactory.class)
,然后按照@ DiscoS2