繁体   English   中英

在Controller Mockito Junit测试案例中模拟接口的两种不同实现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM