gpt4 book ai didi

java - Mockito 和嵌套方法调用

转载 作者:行者123 更新时间:2023-12-01 07:32:33 24 4
gpt4 key购买 nike

我有 3 节课:

public class SomeDAO {

// that method I'd want to catch and change
public void getObj() { ... }

}

public class MainService {

private Service2 service2;

public void doMain() {
service2.doSomethingAnother();
}

}

public class Service2 {

private SomeDAO someDAO

public void doSomethingAnother() {
someDAO.getObj();
}
}

我所需要的 - 调用doMain,但在service2.doSomethingAnother()内使用自定义someDao.getObj():

public TestClass {

@InjectMocks
private final MainService mainService = new MainService();

@InjectMocks
private final Service2 service2 = new Service2();

@Mock
private SomeDAO someDao;

@Test
public void testMe() {

// substitution
when(someDao.getObj()).thenReturn(new MyObj());

// then I'm calling the outer method
mainService.doMain();

}

}

运行该测试时,我在 ma​​inService.doMain() 中有 NPE:service2 in null..

testMe 对象service2 内部处于 Activity 状态且不为 null,它已被声明为类变量并已初始化。

我是否误解了@InjectMock的行为?

最佳答案

Service2 不会注入(inject)到 MainService 中,因为它不是模拟。因此,mainService 对象的 server2 属性为 null

你也试图模仿得太深。测试 MainService 的正确方法是模拟 Service2 的依赖关系,而不是 SomeDAO

在模拟 SomeDAO 的依赖项时,为 Service2 提供单独的测试类会更好。

public TestClass {

@InjectMocks
private MainService mainService;

@Mock
private Service2 service2;

@Before
public void setUp() {
initMocks(this);
}

@Test
public void testMe() {
mainService.doMain();

verify(service2).doSomethingAnother();

}

}

关于java - Mockito 和嵌套方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16098816/

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