gpt4 book ai didi

java - 如何在不在构造函数中指定的情况下使用 Mockito 注入(inject)字段?

转载 作者:行者123 更新时间:2023-11-29 04:08:41 25 4
gpt4 key购买 nike

我有一个正在使用 Mockito 测试的类 (PriceSetter),该类具有内部依赖项(数据库)。我想模拟这个内部依赖,然后将它注入(inject)到类中,但是我的构造函数中没有指定依赖。因此,Mockito 会自动尝试进行构造函数注入(inject),并且永远不会注入(inject)依赖项。

class PriceSetter {
private Table priceTable;

public PriceSetter(Dependency d1, Dependency d2) {
this.d1 = d1;
this.d2 = d2;
}
}

@RunWith(MockitoJUnitRunner.class)
class PriceSetterTest{
@InjectMocks
private PriceSetter setter;

@Mock Table priceTable;
@Mock Dependency d1;
@Mock Dependency d2;

@Test
public void someTestMethod() {
when(priceTable.getItem(any())).thenReturn(Specified item);
setter.priceTable.getItem("item"); -> Doesn't return item specified by mocked behavior
}
}

我希望 priceTable 被注入(inject),但它没有被注入(inject)。只有 d1 和 d2 是通过构造函数注入(inject)注入(inject)的。

最佳答案

@InjectMocks 只会进行构造函数注入(inject)或属性注入(inject)中的一种,不会同时进行。

Mockito will try to inject mocks only either by constructor injection, setter injection, or property injection in order...

你总能做到

@Before
public void setUp() {
setter.setPriceTable(priceTable);
}

或者您的 table 应该连接起来。然而,最简洁的设计通常是统一您的依赖注入(inject)方法,将所有内容注入(inject)构造函数。由于 @InjectMocks 将选择最大的构造函数并在私有(private)或包私有(private)构造函数上工作,因此一种选择是添加构造函数重载:

class PriceSetter {
private Table priceTable;

public PriceSetter(Dependency d1, Dependency d2) {
this(d1, d2, new DefaultPriceTable());
}

PriceSetter(Dependency d1, Dependency d2, Table priceTable) {
this.d1 = d1;
this.d2 = d2;
this.priceTable = priceTable;
}

}

关于java - 如何在不在构造函数中指定的情况下使用 Mockito 注入(inject)字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56532560/

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