当前位置: 首页 > 知识库问答 >
问题:

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

黄聪
2023-03-14
Interface  - Client
Impl class - PCleint, SClient
@Mock
private Client pclient

@Mock 
private Client sclient

如何区分模拟不同的impl类,从而调用impl类的方法。我应该像下面这样做吗。

@Mock
private PClient pclient

@Mock 
private SClient sclient

对我没有用。任何一个都抛出空指针异常。请指教。

共有1个答案

朱啸
2023-03-14

我想技巧是您需要使用before来存根返回值,并为控制器使用@injectmocks。由于@mock不会返回“真实”对象,它只返回一个“mock”(或fake: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公共类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来存根方法返回。

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);
    }
}
 类似资料:
  • 问题内容: 具有相同方法名称和签名的两个接口。但是由单个类实现,那么编译器将如何确定哪个方法用于哪个接口? 例如: 问题答案: 如果一个类型实现两个接口,并且每个接口定义一个具有相同签名的方法,则实际上只有一个方法,并且它们是不可区分的。例如,如果这两个方法的返回类型冲突,那么它将是编译错误。这是继承,方法重写,隐藏和声明的一般规则,并且不仅适用于两个继承的interface方法之间的可能冲突,还

  • 问题内容: 说我有两个结构: 我希望他们都实现接口A: 像这样对First和Second结构都实现似乎是多余的: 有没有一种方法可以为实现接口A的所有结构提供一个实现?像这样的东西,但似乎不起作用: 谢谢! 问题答案: 不,您不能, 但是 您可以创建一个基本类型,然后将其嵌入到您的2结构中,因此只需要一个基本类型的实现即可: 用法: 操场上的完整例子 嵌入文件

  • 问题内容: 我要测试的Java类(称为)具有以下功能: (有一种方法可以检查条件并调用A或B)。 如何将每个服务的模拟注入适当的变量? 我的Junit拥有以下功能: 但是,当我运行测试以检查在正确条件下调用的服务A / B时,由于没有注入模拟,我得到了空指针。 显然是由于对同一接口()有多个依赖关系。声明模拟服务时,是否可以指定限定词?还是我需要为依赖项设置setter并设置老式方式? 问题答案:

  • 我要测试的Java类(称为)具有以下内容: (有一个方法,它将检查条件并调用a或B)。 显然,这是因为同一个接口()上存在多个依赖关系。在声明模拟服务时,有没有一种方法可以指定限定符?或者我需要为依赖项设置设置器并设置老式的方式吗?

  • 我在WebDriver中的测试有问题。 在第一个包我有2类(页)主页,登录页。 在secound包中,我有test-goToLiginPageTest和LoginTest。 在Gotoligini页面,我检查,我在主页上,并进入登录页面。 在LoginTest中,我检查我是否在登录页面上,并登录。 但来自goToLiginPageTest的两个测试通过,但来自LoginTest的测试失败。 我不确

  • 问题内容: 我正在为具有两个方法methodA,methodB的类编写JUnit测试用例。我想在测试用例中模拟对methodA的methodB调用,我正在对正在测试的类使用间谍,但仍然执行methodB。 这是课程 这是测试课 尽管我已对其进行了模拟,但方法B仍会得到调用。请向我建议一个使用正确方法模拟同一类methodA的methodB调用的解决方案。 问题答案: 我昨天碰到这个,因为间谍最好做