繁体   English   中英

如何覆盖在 Mockito Junit 中的方法内实例化的类?

[英]How to cover the Class instantiated inside a method in Mockito Junit?

如何覆盖在方法中实例化的类并需要获取未设置的值。

这是我的服务类 DemoClass.Java

public class DemoClass{

 public void methodOne(){
    
    ClassTwo classTwo=new ClassTwo();
    classTwo.setName("abc");
    customerRepo.save(classTwo);
    
    ClassThree classThree=new ClassThree();
    classThree.setId(classTwo.getId()); //here causing NullPointerException as ClassTwo is instantiated inside the method and the id value is not set and the test stops here.
    classThree.setName("person1");
    classThree.setUpdatedBy("person2");

    }
}

由于 classTwo 在方法级别实例化,因此测试方法不会获取 getId()。 我无法更改或向 Controller 类添加任何内容。 测试在该行停止并导致 NullPointerException,因为它不知道 classtwo.getId() 的值,因为它没有设置。 我需要在测试类中覆盖/通过该行。 我也试过嘲笑那个班级和间谍。 任何可用于此的 Mockito 解决方案。

ClassTwo 中的 Id 是自动生成的序列号,因此无需在 DemoClass.Java 中设置

这是我的测试类 DemoClassTest.Java

@RunWith(MockitoJunitRunner.Silent.class)
public void DemoClassTest(){

@InjectMocks
DemoClass demoClass;

@Test
public void testMethodOne(){

  demoClass.methodOne()

}

您可以提供一个customerRepo测试classTwoclassTwo上设置一些特定的id

public class TestCustomerRepo extends CustomerRepo {

    public void save(ClassTwo classTwo) {
        classTwo.setId(4711L);
    }
}

但是由于您似乎正在测试 JPA 代码,因此执行包含实际数据库的集成测试可能是一个更好的主意。

我通常这样做:

long testId = 123;
Mockito.when(customerRepo.save(Mockito.any())).thenAnswer(i -> {
  ClassTwo entity = (ClassTwo)invocation.getArgument(0);
  entity.setId(testId);
  return entity;
});

如果您想在 ClassThree 实体上断言某些内容,请在 ClassThree 存储库模拟上执行 Mockito.verify。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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