java - 注入(inject) stub 服务代替 Autowiring 的 bean 进行单元测试

标签 java spring unit-testing dependency-injection autowired

给定这个类:

 public SomeClass implements SomeInterface {

      @Autowired private RemoteService rService;

 }

并给出这个单元测试:

 public SomeClassTest {

 ...
 SomeClass sc = (SomeClass) ctx.getbean("someService");
 ..
 }

我想用其他对象来 stub “rService”。我不想修改 SomeInterface 方法来公开任何 getter/setter,因为“rService”仅适用于一种实现。

最佳答案

除了通过测试中的 setter 注入(inject)重置 RemoteService 的 mock/stub 之外:

someClass.setRemoteService( remoteServiceMock );

(如果由于某种原因以上对你不起作用......)=> 你可以创建一个“test-config.xml”,你唯一要重新定义的 bean 是 remoteService具有相同的(真实的)bean 名称,但具有 stub 实现,因此它可以覆盖真实的 bean:

<bean id="remoteService" class="org.your.package.remote.RemoteServiceStub"/>

RemoteServiceStub 将扩展 RemoteService,因此它可以通过类型 Autowiring 到 SomeClass

然后在您的测试中,像往常一样注入(inject) SomeClass:

@ContextConfiguration(locations = { "classpath:/path/to/test-config.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class MyBeanTest {

    @Autowired
    private SomeClass someClass;

    @Test
    public void someClassShouldBehave() {
        ...
    }
}

关于java - 注入(inject) stub 服务代替 Autowiring 的 bean 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7825992/

相关文章:

java - Java、Spring 和 Angularjs Web 应用程序的最佳方法是什么?

spring - JPA entityManager 不保存数据,flush 抛出 "no transaction in progres"异常

python - 如何设置和拆卸用于单元测试的临时 Django 数据库?

java - 如何在使用 Mockito.mock() 时启用 STRICT_STUBS

java - 如何在 Webviewer JavaFx 内部的网站浏览器中打开链接

Spring Boot JPA findByUuid

django - 在同一个 Django unittest 测试用例中测试多个 IntegrityErrors

c++ - 使用 CppUnit 测试静态函数

java 日期格式 - GMT 0700 (PDT)

java - 未调用 Crossfield 验证的自定义类级别约束