请考虑以下代码:
@Singleton
public class MyServiceImpl {
public int doSomething() {
return 5;
}
}
@ImplementedBy(MyServiceImpl.class)
public interface MyService {
public int doSomething();
}
public class MyCommand {
@Inject private MyService service;
public boolean executeSomething() {
return service.doSomething() > 0;
}
}
public class MyCommandTest {
@InjectMocks MyServiceImpl serviceMock;
private MyCommand command;
@Before public void beforeEach() {
MockitoAnnotations.initMocks(this);
command = new MyCommand();
when(serviceMock.doSomething()).thenReturn(-1); // <- Error here
}
@Test public void mockInjected() {
boolean result = command.executeSomething();
verify(serviceMock).doSomething();
assertThat(result, equalTo(false));
}
}
此外,出现此错误的原因可能是:1。您使用final/private/equals()/hashCode()方法中的任一个作为存根。这些方法不能被截取/验证。不支持在非公共父类上声明的模拟方法。2.内部when()不是对mock而是对其他对象调用method。
我是通过Guice进行依赖注入的新手,不知道为什么我不能以这种方式模拟实现对象?
一个简单的解决方案是将CDI与构造函数注入结合起来,而不用考虑Guice进行测试:
public class MyCommand {
private final MyService service;
@Inject
public MyCommand(MyService service) {
this.service = service;
}
public boolean executeSomething() {
return service.doSomething() > 0;
}
}
@RunWith(MockitoJUnitRunner.class)
public class MyCommandTest {
@Mock
MyServiceImpl serviceMock;
private MyCommand command;
@Before public void beforeEach() {
MockitoAnnotations.initMocks(this);
when(serviceMock.doSomething()).thenReturn(-1); // <- Error here
// inject without Guice
command = new MyCommand(serviceMock);
}
}
否则,如果您不喜欢构造函数注入,测试代码应该如下所示:
@RunWith(MockitoJUnitRunner.class)
public class MyCommandTest {
@Mock
MyServiceImpl serviceMock;
@InjectMocks
private MyCommand command;
@Before
public void beforeEach() {
MockitoAnnotations.initMocks(this);
command = new MyCommand();
when(serviceMock.doSomething()).thenReturn(-1); // <- Error here
}
}
问题内容: 我知道关于模拟和测试有很多问题,但是我发现没有任何问题可以完美地帮助我,因此我仍然对理解以下内容有疑问: 如果我弄错了,请纠正我,但据我所知,单元测试用于隔离测试一个特定类的业务逻辑,并且如果有外部需要的任何对象,它们将被模拟。因此,例如,如果我有一个简单城市居民的管理系统,该系统将居民添加到列表中并按姓名返回居民(假设:居民仅包含一些基本个人信息),如下所示: 如果现在我要进行单元测
我的实现出了什么问题?谢谢
遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte
我有一个类,我正在为我的服务注入一个代理。
我用Mockito进行了Java测试: Kotlin.TypeCastException:null不能强制转换为非null类型java.util.HashMap 如何正确模拟属性?