Java 模拟方法中的自动连线字段

Java 模拟方法中的自动连线字段,java,junit,mockito,Java,Junit,Mockito,我想知道是否有办法模拟正在自动连线的场 考虑以下情况 我有一个类名a public class A { @Autowired private B b; public void aMethod() { b.method(); } } 另一个B类看起来像这样 public class B { public void method() { // some code } } 现在我想为该方法编写junit 我知道有一种方法

我想知道是否有办法模拟正在自动连线的场

考虑以下情况

我有一个类名a

public class A {
    @Autowired
    private B b;

    public void aMethod() {
         b.method();
    }
}
另一个B类看起来像这样

public class B {

    public void method() {
    // some code
    }
}
现在我想为该方法编写junit

我知道有一种方法可以像这样模拟自动连线场

public class TestA {

   @InjectMock
   private A a;

   @Mock
   private B b;


    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    public void testAMethod() {
        // write test case.
    }

}
但我的问题是->在用新的方法创建对象之后,有没有办法在方法内部模拟自动连接字段

乙二醇

请提出建议,否则没有办法这么做

我不想改变自己的习惯。我也不想添加getter和setter或reflection。我只是想知道,在创建类的新对象之后,是否有办法模拟B实例

怎么样


它仍然是基于反射的,并且有所有相关的缺点,尽管它非常简单且易于阅读

使用mockito无法做到这一点,这需要修改被测试类的字节码。然而,Powermock允许这样的存根。但是请注意,我和Powermock的创建者Johan Haleby将推动重构,而不是使用Powermock。Powermock功能非常强大,可能太多了,而且工作允许任何人编写遗留代码,这将是很难维护或扩展的,您可以在设计糟糕的遗留代码中找到


在你的情况下,我不知道你的依赖注入有什么问题。但是,如果代码需要一个新的B实例,那么在一个工厂/提供者/构建器类中插入一个将生成一个新的B实例可能会很有用。这样的代码可以很容易地用Mockito存根。

您愿意使用反射吗?另一种方法是使其受到保护,让您的测试类扩展并直接设置它。不,我想在不进行反射或更改修饰符的情况下进行设置。在不进行反射的情况下,无法访问私有字段。如果有办法的话,private就不再是private了。
public class TestA {


    public void testAMethod() {
       A a =new A();

       // how to mock the B instance in it.

    }

}
A a = new A();
B b = mock(B.class);
ReflectionTestUtils.setField(a, "b", b);