[英]Mocking two different implementation of an Interface in Controller Mockito Junit test case
我有一个带有两个实现类PClient和SClient的interface(Client)。
Interface - Client
Impl class - PCleint, SClient
我有一个控制器,其中两个impl类都使用限定符spring boot注解自动连接。 现在,我需要为控制器编写JUNIT Mockito测试用例。
我不确定如何模拟具有相同接口的不同Impl类。 我尝试通过以下方式进行模拟,但是在相应模拟的stub方法中抛出了空指针异常。
@Mock
private Client pclient
@Mock
private Client sclient
我如何区分模拟不同的impl类,以便调用impl类的方法。 我应该喜欢以下吗?
@Mock
private PClient pclient
@Mock
private SClient sclient
它对我没有用。 要么抛出空指针异常。 请指教。
我猜想这些技巧是您需要使用Before
存根返回值并使用@InjectMocks
作为控制器。 由于@Mock
不会返回“真实”对象,因此只会返回一个“ mock”(或fake:P)对象。 因此,当您调用此“模拟”对象的方法时,它不会返回该方法的实际输出,而是返回null
。 这就是为什么您需要使用@Before
存根返回。
请参阅下面的示例代码:
客户端界面
public interface Client {
String someMethod();
}
实施课程
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;
}
}
客户端控制器
@Controller公共类ClientController {
@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
以对方法返回@Before
进行存根。
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个-31ms
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.