当前位置: 首页 > 知识库问答 >
问题:

如何使用Mockito注入字段而不在构造函数中指定?

梁昊天
2023-03-14

我有一个用Mockito测试的类(PriceSetter),这个类有一个内部依赖项(一个数据库)。我想模拟这个内部依赖关系,然后将其注入类中,但在我的构造函数中没有指定依赖关系。因此,Mockito会自动尝试进行构造函数注入,而依赖项永远不会被注入。

我尝试在我的数据库对象上使用@mock,在我的PriceSetter类上使用@injectmocks,但是Mockito自动调用构造函数,它无法注入我的数据库mock,因为数据库没有传递到构造函数中。

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被注入,但它没有被注入。通过构造函数注入只注入d1和d2。

共有1个答案

陈誉
2023-03-14

@injectmocks将只执行构造函数注入或属性注入中的一个,而不是两个都执行。

Mockito将尝试仅通过构造函数注入、设置器注入或属性注入来注入模拟...

你总是可以做的

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

或者您的桌子应该如何连接。然而,最干净的设计通常是统一您的依赖注入方法,以将所有内容注入构造函数。因为@injectmocks将选择最大的构造函数并处理私有或包私有构造函数,所以一个选择是添加一个构造函数重载:

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;
    }

}
 类似资料:
  • 我有一个特殊的情况,在这里我必须模拟一些字段,并为我的类同时使用@mock和@spy,因为在一些测试中我需要改变它自己的方法的行为。我使用@InjectMocks作为构造函数。看起来是这样的: 正在测试的服务: 问题是--正如代码中所评论的那样--final字段没有被注入并且它是空的。当我移除final关键字时,它将被正确地注入,并且所有测试都按照预期工作。我尝试了其他主题中的一些技巧--也使用了

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 问题内容: 我在这里找不到任何合理的答案,所以我希望它不会重复。那么为什么我应该更喜欢setter或构造函数注入而不是简单注入 如果您在类初始化期间需要对注入的bean进行某些操作,则可以使用构造函数注入的用法 但是仍然,它几乎和方法一样,并且我完全不会进行setter注入,这不只是Spring和其他DI框架之后的遗物吗? 问题答案: 构造函数和属性注入使您可以轻松地在非CDI环境中(例如,单元测

  • 我有一个抽象类,它有一个正在自动连接的依赖项: 我有一个扩展这个抽象类的类: 现在,在进行单元测试时,我可以做到: 这可以很好地工作,但是如果我对ClassA使用构造函数注入,则classC会出现空指针异常。 在第二种情况下,我甚至尝试用普通的构造函数调用替换InjectMocks,但ClassC对象没有被嘲笑。 堆栈跟踪:

  • 我有一个接口,它在两个地方定义如下: 我的客户端实现类没有任何注释,只有必需的构造函数。在这种情况下,如何限定正确的接口实现用法?我不想使用,因为在我的例子中,将其中一个用法命名为primary在语义上是不正确的(它们在某种意义上是相等的)。我需要用相同的实现类传递相同的接口,但针对受尊敬的客户机的特定用例进行了不同的配置。我想命名一个参数就足够了,通过这个参数我将实现注入到bean创建方法中,但