在 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 毫秒