如何用mockito模拟

时间:2016-07-15 16:52:42

标签: java android unit-testing mocking

我的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);

3 个答案:

答案 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));
}

最佳做法

  • 命名方法和变量时,请使用camelCase。因此main_activity变为MainActivitysome_method变为SomeMethod

答案 1 :(得分:0)

您需要一种方法来覆盖测试中A的实例。通常,这是使用注射框架完成的。对于一个简单的情况,您可以使测试字段protected(假设测试类与测试中的类位于同一个包中)。

您看到的错误会与“真实”对象进行交互,就好像它是模拟对象一样。

在这种情况下,SomeFactory是一个真实的对象,因此它不能是when()ed

答案 2 :(得分:0)

从@ DiscoS2的回应来看,这个声明确实存在问题

MockitoAnnotations.initMocks(this);

您应该使用SomeFactory someFactory = mock(SomeFactory.class),然后按照@ DiscoS2

的更新回复进行操作