gpt4 book ai didi

java - 为了用 Guice 注入(inject)一个类,替换的类必须作为对象参数传递给构造函数?

转载 作者:行者123 更新时间:2023-12-01 10:26:12 24 4
gpt4 key购买 nike

为了用 Guice 注入(inject)类,替换的类必须作为对象参数传递给构造函数,这是真的吗?我认为这是“当然”,但我想我会问。

我编写了一个带有两个构造函数的测试类(CUT)。一个构造函数采用一个参数,即依赖组件 (DOC) 类型的对象。另一个构造函数调用第一个构造函数,传递一个 new DOC()。单元测试使用注入(inject)器来指示 CUT 使用 MockDOC 而不是 DOC。当我删除默认的 CUT() 时,单元测试会出现运行时错误:com.google.inject.internal.ComputationException:java.lang.NoClassDefFoundError:org/objectweb/asm/ClassVisitor

代码:

//The class under test:
public class CUT {
DOC m_DOC;

@Inject
public CUT(DOC doc)
{
m_DOC = doc;
}

// When this ctor is added, there is a run time error:
// com.google.inject.internal.ComputationException: java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
// @Inject
// public CUT()
// {
// this(new DOC());
// }

public boolean getVal()
{
return m_DOC.getVal();
}
}

// The depended-on-component:
public class DOC {
@Inject
public DOC()
{

}

// The REAL DOC returns 'true' MockDOC will return false
public Boolean getVal()
{
return true;
}
}

模拟文档:

     // This is the class we want CUT to call during unit test
class MockDOC extends DOC
{
@Override
public Boolean getVal()
{
// Real DOC returns 'true'. We return false so unit tester knows we got injected
return false;
}
}

使用MockDOC测试CUT的单元测试:

    // Test the CUT class by substituting a mock for CUT's DOC
public class CUTTest {

@Test
public void testGetVal() throws Exception {
// Direct Guice to inject our MockDOC for CUT's use of DOC
Injector m_injector = Guice.createInjector(new CUTTestModule());

// Ask Guice to create a CUT object
CUT cut = m_injector.getInstance(CUT.class);

// The DOC returns 'true', while the mock DOC returns 'false. So we'll get 'false' if the injection
// succeeded
assertEquals(cut.getVal(), false);
}

// The class that we will pass to Guice to direct its injection
class CUTTestModule implements Module {
public CUTTestModule()
{
super();
}

@Override
public void configure(Binder binder) {
binder.bind(DOC.class).to(MockDOC.class);
}
}
}

最佳答案

首先,您也可以在字段上使用 Guice 注入(inject)。

但是关于你的主要问题...为什么要将 @Inject 注释添加到默认构造函数(没有参数的构造函数)?没有要注入(inject)的参数。

// When this ctor is added, there is a run time error:
// com.google.inject.internal.ComputationException: java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
// @Inject
// public CUT()
// {
// this(new DOC());
// }

我会删除@Inject

关于java - 为了用 Guice 注入(inject)一个类,替换的类必须作为对象参数传递给构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35350664/

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