mockito 如何在JUnit 5中测试公共方法时模拟私有方法

ohtdti5x  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(213)

如何在JUnit 5中测试公共方法时模拟私有方法。

class School{
    @Autowired
    private SchoolRepo schoolRepo;

    private String getSchoolName(String name){
         return "New Name :"+schoolRepo.findByName(name);
    }
    
    public String getFullNameWithSchool(){
        String schoolName = getSchoolName("HMS");
        String fullName = "SK "+schoolName;
        return fullName;
    }
}

字符串
我想测试(使用JUnit 5)getFullNameWithSchool方法并模拟私有方法getSchoolName方法。

8qgya5xd

8qgya5xd1#

为了给予一个代码示例,其中包含注解中给出的要点,

class School {
 private final SchoolRepo repo;

 // constructor injection
 @Autowired
 public School(SchoolRepo r) {
  repo = r;
 }

 private String getSchoolName(String name){
   return "New Name :"+schoolRepo.findByName(name);
 }
    
 public String getFullNameWithSchool(){
   String schoolName = getSchoolName("HMS");
   String fullName = "SK "+schoolName;
   return fullName;
 }

字符串
在你的测试中

class SchoolTest {
 private SchoolRepo repo = mock(SchoolRepo.class);

 // possible to use mock because of constructor injection
 private School school = new School(repo);

 @Test
 public void testSchoolName() {
  when(repo.findByName(any())).thenReturn("school");

  String name = school.getFullNameWithSchool();

  // assert the result is correct
  assertEquals(name, "SK New Name: school");
  // assert the query was performed with the fixed HMS string
  verify(repo).findByName("HMS");
 }
}


请注意,我觉得使用固定的String完成查询有点奇怪。“School“听起来像一个域类,我希望它有几个,每个都有一个名称。我也不希望它自动连接仓库,也许你想创建一个SchoolService连接仓库,并为查询仓库的给定School提供名称。

fiei3ece

fiei3ece2#

前言:

你不能用JUnit模拟私有方法。
你可以用PowerMock来模仿它们。
解决方法是使用反射,但不建议这样做。

解决方案:

私有方法应该在公共方法中调用。然后你可以测试公共方法,包括私有方法。
举个例子:如果你有一个服务,测试它的公共方法。如果它的公共方法调用私有方法,它们也会被自动测试。

相关问题