在 Controller Mockito Junit 测试用例中模拟一个接口的两个不同实现
Mocking two different implementation of an Interface in Controller Mockito Junit test case
我有一个接口(客户端),分别有两个实现 类 PClient 和 SClient。
Interface - Client
Impl class - PCleint, SClient
我有一个控制器,其中两个 impl 类 都是使用限定符 spring 引导注释自动装配的。现在我需要为控制器编写 JUNIT mockito 测试用例。
我不确定如何模拟具有相同接口的不同 Impl 类。我尝试通过以下方式进行模拟,但它会在相应模拟的存根方法中抛出空指针异常。
@Mock
private Client pclient
@Mock
private Client sclient
我如何区分模拟不同的 impl 类 以便调用 impl 类 的方法。我应该喜欢下面的吗?
@Mock
private PClient pclient
@Mock
private SClient sclient
它对我不起作用。任何一个都抛出 null pointer exception 。请指教
我想技巧是您需要使用 Before
存根 return 值并使用 @InjectMocks
作为控制器。
由于 @Mock
不会 return 一个 "real" 对象,它只是 return 一个 "mock"(或 fake:P )一个。因此,当您调用此 "mock" 对象的方法时,它不会 return 您方法的实际输出,而是返回 null
。这就是为什么你需要用 @Before
.
存根 return
请参阅下面的示例代码:
客户端界面
public interface Client {
String someMethod();
}
Class 实施
public class PClient implements Client {
private static final String name = "PClient";
@Override
public String someMethod() {
return name;
}
}
public class SClient implements Client{
private static final String name = "SClient";
@Override
public String someMethod() {
return name;
}
}
客户端控制器
@控制器
public class 客户端控制器 {
@Autowired
private PClient pClient;
@Autowired
private SClient sClient;
public ClientController(){
}
public String executePClient(){
return this.pClient.someMethod();
}
public String executeSClient(){
return this.sClient.someMethod();
}
public String execute(Client client){
return client.someMethod();
}
}
测试用例 你需要添加一个@Before
来stub方法return.
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class ClientControllerTest {
@Mock
private PClient pclient;
@Mock
private SClient sclient;
@InjectMocks
private ClientController clientController;
@Before
public void setup(){
when(pclient.someMethod()).thenReturn(new PClient().someMethod());
when(sclient.someMethod()).thenReturn(new SClient().someMethod());
}
@Test
public void testPClient(){
String result = clientController.executePClient();
assertEquals("PClient",result);
}
@Test
public void testSClient(){
String result = clientController.executeSClient();
assertEquals("SClient",result);
}
@Test
public void testExecuteWithPClient(){
String result = clientController.execute(pclient);
assertEquals("PClient",result);
}
@Test
public void testExecuteWithSClient(){
String result = clientController.execute(sclient);
assertEquals("SClient",result);
}
}
结果:测试通过:4 个测试中的 4 个 - 31 毫秒
我有一个接口(客户端),分别有两个实现 类 PClient 和 SClient。
Interface - Client
Impl class - PCleint, SClient
我有一个控制器,其中两个 impl 类 都是使用限定符 spring 引导注释自动装配的。现在我需要为控制器编写 JUNIT mockito 测试用例。
我不确定如何模拟具有相同接口的不同 Impl 类。我尝试通过以下方式进行模拟,但它会在相应模拟的存根方法中抛出空指针异常。
@Mock
private Client pclient
@Mock
private Client sclient
我如何区分模拟不同的 impl 类 以便调用 impl 类 的方法。我应该喜欢下面的吗?
@Mock
private PClient pclient
@Mock
private SClient sclient
它对我不起作用。任何一个都抛出 null pointer exception 。请指教
我想技巧是您需要使用 Before
存根 return 值并使用 @InjectMocks
作为控制器。
由于 @Mock
不会 return 一个 "real" 对象,它只是 return 一个 "mock"(或 fake:P )一个。因此,当您调用此 "mock" 对象的方法时,它不会 return 您方法的实际输出,而是返回 null
。这就是为什么你需要用 @Before
.
请参阅下面的示例代码:
客户端界面
public interface Client {
String someMethod();
}
Class 实施
public class PClient implements Client {
private static final String name = "PClient";
@Override
public String someMethod() {
return name;
}
}
public class SClient implements Client{
private static final String name = "SClient";
@Override
public String someMethod() {
return name;
}
}
客户端控制器
@控制器 public class 客户端控制器 {
@Autowired
private PClient pClient;
@Autowired
private SClient sClient;
public ClientController(){
}
public String executePClient(){
return this.pClient.someMethod();
}
public String executeSClient(){
return this.sClient.someMethod();
}
public String execute(Client client){
return client.someMethod();
}
}
测试用例 你需要添加一个@Before
来stub方法return.
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class ClientControllerTest {
@Mock
private PClient pclient;
@Mock
private SClient sclient;
@InjectMocks
private ClientController clientController;
@Before
public void setup(){
when(pclient.someMethod()).thenReturn(new PClient().someMethod());
when(sclient.someMethod()).thenReturn(new SClient().someMethod());
}
@Test
public void testPClient(){
String result = clientController.executePClient();
assertEquals("PClient",result);
}
@Test
public void testSClient(){
String result = clientController.executeSClient();
assertEquals("SClient",result);
}
@Test
public void testExecuteWithPClient(){
String result = clientController.execute(pclient);
assertEquals("PClient",result);
}
@Test
public void testExecuteWithSClient(){
String result = clientController.execute(sclient);
assertEquals("SClient",result);
}
}
结果:测试通过:4 个测试中的 4 个 - 31 毫秒