gpt4 book ai didi

java - 如何仅模拟一种注入(inject)依赖项的一种方法并正常注入(inject)其余方法?

转载 作者:行者123 更新时间:2023-11-30 07:52:17 24 4
gpt4 key购买 nike

我正在为一个大量使用依赖注入(inject)的项目编写测试。

所以通常我会注入(inject)我正在测试的对象:

public class RegistrationTest
extends WithApplication {

private RegistrationController controller;

@Before
public void setUp() throws Exception {
Injector injector = app.injector();
controller = injector.instanceOf(RegistrationController.class);
}

@Test
public void openRegistrationView() {
Result result = controller.registrationForm();
assertEquals(OK, result.status());
}
}

现在我需要模拟被测类的依赖项之一的方法的返回值。

为此,我可以使用 @InjectMocks@RunWith(MockitoJUnitRunner.class) 来注入(inject)模拟的依赖项。

@RunWith(MockitoJUnitRunner.class)
public class RegistrationTest
extends WithApplication {

@InjectMocks
private RegistrationController controller;
@Mock
private FormFactory formFactory;
@Mock
private RegistrationIpCache registrationIpCache;

@Test
public void openRegistrationView() {
doReturn("test").when(registrationIpCache).getLast();
Result result = controller.registrationForm();
assertEquals(OK, result.status());
}
}

但是虽然我只想模拟 RegistrationIpCache 的一个方法调用,但我需要模拟整个类,而且我还需要模拟 RegistrationController 的所有其他依赖项,例如 FormFactory 在我的示例中。现在所有模拟类的每个方法都无法按预期工作。

当然我可以使用 doCallRealMethod() 来模拟所有依赖项的每个方法

doCallRealMethod().when(formFactory).form(Registration.class);

但是正如您已经可以想象的那样,工作量和实现此功能所需的样板代码量是极其巨大的。

是否可以正常注入(inject)我的类,然后只监视一个依赖项或模拟一个依赖项的一种方法?

最佳答案

您需要使用@Spy 而不是@Mock

@InjectMocks
private RegistrationController controller;
@Mock
private FormFactory formFactory;
@Spy
private RegistrationIpCache registrationIpCache;

但请注意,在这种情况下,@Spy 将尝试使用默认构造函数。如果默认构造函数不可用,请使用显式构造函数调用:

@Spy
private RegistrationIpCache registrationIpCache = new RegistrationIpCache(dependencies);

以下是 Mockito 无法从 @Spy 实例化您的类的情况 javadoc :

Mockito will try to find zero argument constructor (even private) and create an instance for you. But Mockito cannot instantiate inner classes, local classes, abstract classes and interfaces.

这里是手动注入(inject)依赖的例子:

@RunWith(MockitoJUnitRunner.class)
public class RegistrationTest {
private RegistrationController controller;

private RegistrationIpCache spyRegistrationIpCache; //this is the dependencies that you need to spy

@Before
public void setUp() throws Exception {
spyRegistrationIpCache = spy(realInstanceOfregistrationIpCache);

controller = new RegistrationController(registrationIpCache, realInstanceOfFormFactory);
}
}

在这种情况下,您必须编写更多代码,但这使您可以更好地控制对象实例化和依赖项注入(inject)。请注意,不需要使用构造函数实例化。由于您手动执行此操作,因此您可以根据需要对其进行实例化。

关于java - 如何仅模拟一种注入(inject)依赖项的一种方法并正常注入(inject)其余方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46076414/

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