gpt4 book ai didi

java - 模拟类的内部方法

转载 作者:行者123 更新时间:2023-12-01 20:18:37 25 4
gpt4 key购买 nike

public Employe{
public Double method1(int id){
return method2(id);
}
public Double method2(int id) throws DatabaseException{
//Some Code
Employe e = employeRepositoy.getEmployeWithId(id);
return e.getSalary();
}
}

现在我的两个测试场景是这样的

@Test(expected = DatabaseException.class)
public void testemploye1() throws ServiceException, DatabaseException {
Employe employe = Mockito.spy(new Employe());
when(employe.method2(45585)).thenThrow(DatabaseException.class);
employe .method1(45585);
}

@Test
public void testEmployee() throws ServiceException, DatabaseException {
Employe employe = Mockito.spy(new Employe());
when(employe.method2(45585)).thenReturn(3256);
Double sal = employe .method1(45585);
isTrue(sal.equals(3256));
}

第一个测试场景运行罚款并引发数据库异常。但在第二个测试场景中,调用不是模拟而是进入内部 method2 并抛出空指针异常。在这方面我有点不喜欢任何帮助。

最佳答案

发生 NPE 是因为 employeRepositoy 为 null。您确定testemploye1()通过了吗?据我所知,它会因相同的 NPE 而失败,也许如果您查看实际的异常原因,您可能会发现 testemploye1() 也抛出了 NPE。

我认为测试方法有点“偏离”,如果目的是测试 method2 的行为(无论是直接调用还是通过 method1() 调用),那么我认为你应该 mock employeRepositoy并注入(inject)它,然后为其提供预期的行为。例如:

@Test(expected = DatabaseException.class)
public void testemploye1() {
EmployeeRepository employeeRepository = Mockito.mock(EmployeeRepository.class);

Employe employe = new Employe(employeeRepository);

int id = 12345;
when(employeeRepository.getEmployeWithId(id)).thenThrow(new DatabaseException());
employe.method1(id);
}

@Test
public void testEmployee() {
EmployeeRepository employeeRepository = Mockito.mock(EmployeeRepository.class);

Employe employe = new Employe(employeeRepository);

int id = 12345;
Employe storedEmploye = ...;
when(employeeRepository.getEmployeWithId(id)).thenReturn(storedEmploye);
Double salary = employe.method2(id);
assertEquals(storedEmploye.getSalary(), salary);
}

但是,正如其他发帖者指出的那样,这种测试方法看起来确实相当奇怪。

关于java - 模拟类的内部方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45284528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com