Mockito与@Configurable

问题描述 投票:2回答:1

我正在尝试为通常由Spring管理的某些代码编写JUnit测试。

假设我有这个:

@Configurable
public class A {
  @Autowired MyService service;

  public void callA() { service.doServiceThings(); }
}

我可以使用Mockito和PowerMock这样为该类编写测试:

@RunWith(PowerMockRunner.class)
public class ATest {
  @Spy MyService service = new MyService();

  @Before void initMocks() { MockitoAnnotations.initMocks(this); }

  @Test void test() {
    @InjectMocks A a = new A(); // injects service into A
    a.callA();
    //assert things
  }
}

但是现在我遇到了其他一些类构造A实例的情况:

public class B {
  public void doSomething() {
    A a = new A(); // service is injected by Spring
    a.callA();
  }
}

如何使服务注入到在B方法内部创建的A实例中?

@RunWith(PowerMockRunner.class)
public class BTest {
  @Spy MyService service = new MyService();

  @Before void initMocks() { MockitoAnnotations.initMocks(this); }

  @Test testDoSomething() {
     B b = new B();
     // is there a way to cause service to be injected when the method calls new A()?
     b.doSomething(); 
     // assert things
  }
}
java spring junit mockito powermock
1个回答
0
投票

字段注入是不好的,但仍然可以做一件事来轻松地对A实例化进行存根(或者可能我误解了……)。使B具有通过构造函数注入的AFactory。

public class B {
    private final AFactory aFactory;
    public B(AFactory aFactory) {
        this.aFactory=aFactory;
    }
    public void doSomething() {
    A a = aFactory.getA();
    a.callA();
    }
}

然后您可以创建aFactory的Mock,并通过构造函数将其注入B。

© www.soinside.com 2019 - 2024. All rights reserved.