gpt4 book ai didi

java - 如何使用mockito进行模拟

转载 作者:行者123 更新时间:2023-12-01 09:41:41 25 4
gpt4 key购买 nike

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

最佳答案

你不是在 mock 你的工厂。另外,方法调用错误。

改为执行此操作。

    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 变为 MainActivitysome_method 变为 SomeMethod

关于java - 如何使用mockito进行模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38401412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com