我有一个接口(客户端(,分别有两个实现类PClient和SClient。
Interface - Client
Impl class - PCleint, SClient
我有一个控制器,其中两个 impl 类都使用限定符弹簧引导注释自动连接。现在我需要为控制器编写 JUNIT 模拟测试用例。
我不确定如何模拟具有相同接口的不同 Impl 类。我尝试通过以下方式进行模拟,但它在相应模拟的存根方法中抛出空指针异常。
@Mock
private Client pclient
@Mock
private Client sclient
我如何区分模拟不同的 impl 类,以便调用 impl 类的方法。我应该像下面那样做。
@Mock
private PClient pclient
@Mock
private SClient sclient
它对我不起作用.任何一个都会抛出空指针异常。请指教。
是您需要使用Before
来存根返回值并为控制器使用@InjectMocks
。由于@Mock
不会返回"真实"对象,因此它只返回一个"模拟"(或假:P(对象。因此,当您调用此"mock"对象的方法时,它不会返回方法的实际输出,而是返回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公共类客户端控制器 {
@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
来存根方法返回。
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 毫秒