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

类的模拟构造函数

周弘毅
2023-03-14

我正在为我的java类编写测试类。我将Junit5与Mockito一起使用。

我使用的Junit5与Power Mockito不兼容,所以我只使用Mockito。

我有类Emp,它具有下面这样的函数findSalary,并且在构造函数中初始化了AspeProfileClient

Class Emp {

......

  public void findSalary(empId) {

    ...

    TaxReturn taxReturn = new TaxReturn(EmpProfileClient);

    int value = taxReturn.apply(new TaxReturnRequest.withEmpId(empId))

                    .returnInRupee();

    ...

  }

}

当我编写测试用例时,我模拟了emprofileclient,但是由于我们在一个方法中创建TaxReturn,我如何模拟TaxReturn。应用,这样我就可以编写期望值,根据我在测试类中设置的选择获得值?

共有2个答案

黄永怡
2023-03-14

如果我正确理解了你的问题(你正在寻找mockingtaxReturn.apply),我建议下一步:

第一重构taxReturn实例化(因为与试图模拟局部变量相比,模拟方法行为要容易得多)

public class EmpService {

 public int findSalary(Integer empId) {
  //...
  // It's doesn't matter what the actual empProfileClient type is
  // as you mocking creation behavior anyway  
  Object empProfileClient = null;
  TaxReturn taxReturn = createClient(empProfileClient);   
  int value = taxReturn.apply(new TaxReturnRequest().withEmpId(empId))
   .returnInRupee();
  //...
  return value; // or whatever 
 }

 protected TaxReturn createClient(Object empProfileClient) {
  return new TaxReturn(empProfileClient);
 }

}

第二使用Mockito。spy()在您的测试中:

class EmpServiceTest {

  @Test
  void findSalary() {
    TaxReturn taxReturn = Mockito.mock(TaxReturn.class);
    // this is the main idea, here you using partial EmpService mock instance
    // part is mocked(createClient()) and other part(findSalary()) is tested
    EmpService service = Mockito.spy(EmpService.class);
    when(service.createClient(any())).thenReturn(taxReturn);
    when(taxReturn.apply(any(TaxReturnRequest.class))).thenReturn(taxReturn);
    int yourExpectedValue = 5;
    when(taxReturn.returnInRupee()).thenReturn(yourExpectedValue);
    assertEquals(yourExpectedValue, service.findSalary(0));
  }
}

请记住,any()、spy()、when()和mock()方法都是Mockito API的一部分。所以这里没有隐藏任何东西

卓云
2023-03-14

如果你想模仿它,TaxReturn类应该是Emp类中的注入bean。添加注入框架(如Spring)并注入TaxReturn类。在您编写的测试中,可以注入一个Mock而不是真实的类。请参见mockito框架的@InjectMocks注释。

 类似资料:
  • 我是莫基托的新手。假设我有一节这样的课 我正在使用Mockito编写一个JUnit测试,我正在使用构造函数创建类的对象。当我安装类时,是否可以模拟Drew()方法?

  • 问题内容: 我想将构造函数模拟为方法。 在我的测试中,我想做这样的事情: 但是给我这个 错误 知道为什么吗? 问题答案: 您可以使用PowerMock模拟构造函数。 如果由于某种原因而无法使用PowerMock,则最可行的解决方案是将工厂注入到包含此方法的任何类中。然后,您将使用工厂创建对象并模拟工厂。

  • 问题内容: 我试图在此模块中找到一种模拟Redis的方法: 使用以下测试代码: 我还尝试了一些变体,但由于基本需要模拟构造函数,因此我有点受阻,我不确定Sinon是否支持这一点? 不知道在这里还有什么尝试,我也尝试按照这里的建议使用rewire,但是从不设置该私有变量。 我想最终伪造我的错误路径。 我很想听听其他人在测试Node js中的Redis所做的事情。 问题答案: 您的问题不是Sinon是

  • 问题内容: 我的课如下: 在构造函数中的逻辑和是我试图嘲弄的事情。我想要任何调用:返回一个虚拟字符串。 我试过了: 但这似乎不起作用。仍在执行构造函数逻辑,而不是获取的模拟对象。 问题答案: 您发布的代码适用于最新版本的Mockito和Powermockito。也许您还没有准备A?试试这个: A.java MockA.java 两项测试均应通过Mockito 1.9.0,powermockito

  • 我一直试图模仿我的服务/业务类来开始测试我的应用程序,但有许多对其他类的“依赖”,主要是存储库和传递给这些存储库的存根。为了能够对我的服务进行单元测试,我一直试图设置它,但我不断地得到错误,我真的不知道我的设置是否正确: 我没有包括接口,因为我觉得没有必要,但如果需要,可以。 但正如您所看到的,我需要传递2个模拟存储库,它们自己是从一个模拟的“存根”实例化的,这就是我的问题。 我尝试过许多不同的方

  • 问题内容: 试图扩大Spock在工作中的吸引力并遇到此问题。实际上是试图为Groovy类编写单元测试,但是它调用了Java。静态方法调用私有构造函数。代码如下: “ SolrZkClient”来自第三方(Apache)Java库。由于它试图连接到ZooKeeper,因此我想对此单元测试进行模拟(而不是在单元测试的内部运行)。 我的测试毫不费力地进入了构造函数,但是我无法超越那个ctor: 反正有这