使用 Mockito 在注入服务 class 中注入对象
Inject object in injected service class using Mockito
我正在尝试为我们的 JavaEE7 应用程序中的服务编写 JUnit 测试。
正在测试的服务 class 注入了另一个服务 class,后者又注入了另一个 class。
这是我的 class 简而言之:
class ServiceA {
ServiceB serviceB;
public void methodA() {
serviceB.methodB();
}
}
class ServiceB {
@Inject
ServiceC serviceC;
public void methodB() {
serviceC.methodC();
}
}
class ServiceC {
public void methodC() {}
}
class TestServiceA {
@Spy
ServiceA serviceA;
@InjectMocks
ServiceB serviceB;
@Before
public void setUp() {
serviceA.serviceB = mock(ServiceB.class);
}
@Test
public void testServiceA() {
serviceA.methodA();
}
}
编辑:从原始记录器问题编辑为一般对象问题。
问题是是否有可能或有必要在我的测试中注入多个级别的对象,或者我是否应该只模拟第一个注入的服务并使用 when-Expressions 捕获对后续服务的所有方法调用?
你的目标是测试当你使用 serviceA.methodA().
时 methodB 是否真的被调用
以下代码执行此操作:
import javax.inject.Inject;
public class ServiceA {
@Inject
ServiceB serviceB;
public void methodA() {
serviceB.methodB();
}
}
import javax.inject.Inject;
public class ServiceB {
@Inject
Logger log;
public void methodB() {
log.debug("log message");
}
}
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.slf4j.Logger;
public class ServiceTest {
/**
* Create an instance of the class ServiceA.
*/
@InjectMocks
private ServiceA serviceA;
/**
* Create a fake instance of ServiceB.
*/
@Mock
private ServiceB serviceB;
/**
* Create a fake instance of Logger.
*/
@Mock
private Logger log;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
/**
* Verify that methodB is called.
*/
@Test
public void testServiceA() {
serviceA.methodA();
verify(serviceB, times(1)).methodB();
}
}
这里的Logger也必须是mock,否则会报NPE
我正在尝试为我们的 JavaEE7 应用程序中的服务编写 JUnit 测试。 正在测试的服务 class 注入了另一个服务 class,后者又注入了另一个 class。 这是我的 class 简而言之:
class ServiceA {
ServiceB serviceB;
public void methodA() {
serviceB.methodB();
}
}
class ServiceB {
@Inject
ServiceC serviceC;
public void methodB() {
serviceC.methodC();
}
}
class ServiceC {
public void methodC() {}
}
class TestServiceA {
@Spy
ServiceA serviceA;
@InjectMocks
ServiceB serviceB;
@Before
public void setUp() {
serviceA.serviceB = mock(ServiceB.class);
}
@Test
public void testServiceA() {
serviceA.methodA();
}
}
编辑:从原始记录器问题编辑为一般对象问题。 问题是是否有可能或有必要在我的测试中注入多个级别的对象,或者我是否应该只模拟第一个注入的服务并使用 when-Expressions 捕获对后续服务的所有方法调用?
你的目标是测试当你使用 serviceA.methodA().
时 methodB 是否真的被调用以下代码执行此操作:
import javax.inject.Inject;
public class ServiceA {
@Inject
ServiceB serviceB;
public void methodA() {
serviceB.methodB();
}
}
import javax.inject.Inject;
public class ServiceB {
@Inject
Logger log;
public void methodB() {
log.debug("log message");
}
}
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.slf4j.Logger;
public class ServiceTest {
/**
* Create an instance of the class ServiceA.
*/
@InjectMocks
private ServiceA serviceA;
/**
* Create a fake instance of ServiceB.
*/
@Mock
private ServiceB serviceB;
/**
* Create a fake instance of Logger.
*/
@Mock
private Logger log;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
/**
* Verify that methodB is called.
*/
@Test
public void testServiceA() {
serviceA.methodA();
verify(serviceB, times(1)).methodB();
}
}
这里的Logger也必须是mock,否则会报NPE