在控制器 Mockito Junit 测试用例中模拟接口的两种不同实现



我有一个接口(客户端(,分别有两个实现类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 毫秒

相关内容

  • 没有找到相关文章

最新更新