Java:使用 Inject 注释对类进行 Junit

标签 java junit dependency-injection mockito guice

@Singleton
public class RealWorkWindow implements WorkWindow {

    @Inject private Factory myFactory;

    public RealWorkWindow (
            LongSupplier longSupplier
    ) {
        defaultWindow = myFactory.create(() -> 1000L);
        workWindow = myFactory.create(longSupplier);
    } 
    ...

正如你所看到的,我正在注入(inject)一个工厂类(通过 FactoryModuleBuilder 注入(inject))

测试代码

@Test
public class RealWorkWindowTest {
    private RealWorkWindow testWindow;

    @BeforeMethod
    void setup() {
        MockitoAnnotations.initMocks(this);

        testWindow = spy(new RealWorkWindow(() -> 1L));
    }

工厂.py

public interface RealWorkWindowFactory {
    RealWorkWindowFactory create(LongSupplier longSupplier);
}

模块

install(new FactoryModuleBuilder()
                        .implement(WorkWindow.class, RealWorkWindow.class)
                        .build(RealWorkWindowFactory.class));

当我运行测试 RealWorkWindowTest 时,测试失败,并显示工厂不存在的 NPE,这是有道理的,因为我认为注入(inject)不会运行。

如何在 junit 中进行注入(inject)测试?或者正确地 mock ?

类似于https://mhaligowski.github.io/blog/2014/05/30/mockito-with-both-constructor-and-field-injection.html中描述的问题

但是我遇到的问题是mock使用了IN构造函数,因此在实例化测试对象时它仍然为空(因为我还没有调用Mockito.init)

最佳答案

如果您使用MockitoJUnitRunner,则可以使用@Mock为Factory创建模拟并注入(inject)它。

@RunWith(MockitoJUnitRunner.class)
public class MyTest {

    @Mock
    private Factory myFactory;

    @InjectMocks
    private RealWorkWindow realWorkWindow;

    @Test
    public void testSomething() {
        when(myFactory.create(/* insert param here */)).thenReturn(/* insert return value here */);

        /* perform your test */
    }
}

关于Java:使用 Inject 注释对类进行 Junit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56435924/

相关文章:

java - HashMap 因未知原因返回空指针

java - 关联表是one for all的一对多关系,如何实现一对多映射?

java - 优化测试用例

java - Junit+ hibernate +Spring+H2 :inserts were executed without errors but select returns no data

java - Kotlin Mockito 总是返回作为参数传递的对象

c# - 在构造函数中依赖注入(inject)上下文类

android - Dagger Activity 图和分离模块

android - Koin vs Kodein - 依赖注入(inject)你更喜欢什么? Kotlin

java - 通过java程序从图像中读取字符值

java - IntelliJ IDEA-java : error: invalid source release: 18