gpt4 book ai didi

java - 使用 Mockito 将模拟对象注入(inject)到声明为测试字段的要测试的对象中不起作用?

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:40 24 4
gpt4 key购买 nike

我有一个类,我正在向我的服务中注入(inject)一个代理。

Service service
{
private ServiceProxy proxy;
public Service(ServiceProxy proxy)
{
this.proxy = proxy;
}
}

它的测试是:

ServiceTest
{
@Mock
ServiceProxy mockProxy;
Service service = new Service(mockProxy);
}

如果我像这样初始化我的类,当我想使用服务对象时,我总是得到一个NPE。为什么 Mockito 这样做?有什么简单的方法可以解决这个问题而不是在每个测试中都声明它?

最佳答案

如果你使用的是 Mockito 版本 1.9.0 或更高版本,实现你想要的最好方法是这样的:

@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {

@Mock
private ServiceProxy proxy;

@InjectMocks
private Service service;

@Test
public void test() {
assertNotNull(service);
assertNotNull(proxy);
}
}

首先是 @RunWith(MockitoJUnitRunner.class) 声明,它将导致 @Mock 和 @InjectMocks 注释在没有任何显式初始化的情况下自动工作。第二件事是,从 Mockito 1.9.0 开始,@InjectMocks 注释可以使用 Constructor 注入(inject) 机制,这是您的 Service 类的最佳选择。

@InjectMocks 的其他选项是Setter 注入(inject)Field 注入(inject)(请参阅docs 顺便说一下)但是您需要一个无参数构造函数才能使用它们。 p>

所以总结 - 你的代码不能工作,因为:

  • 您没有使用 MockitoJUnitRunner 或 MockitoAnnotations.initMocks(this),因此 @Mock 注释无效
  • 即使满足以上条件,您的示例也会失败,因为 mockProxy 将在 测试构建后初始化,您的服务 将被尝试在测试类构造期间初始化,因此它接收空 mockProxy 引用。

如果出于某种原因您不想使用@InjectMocks,唯一的方法是在测试方法主体或@Before 注释的setUp 方法中构造您的Service 对象。

关于java - 使用 Mockito 将模拟对象注入(inject)到声明为测试字段的要测试的对象中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19580197/

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