开发者社区> 问答> 正文

如何在抽象测试类中模拟自动装配的实例?

我有一个抽象服务类,可以自动装配指定类型的存储库。

abstract class SomeService<T extends SomeRepository, U ...> {

@Autowrired
@Accessors(fluent = true)
@Getter(PROTECTED)
private U repositoryInstance;

} 现在,我正在尝试为服务类的子类创建一个抽象测试类。

@SpringBootTest abstract class SomeServiceTest<T extends SomeService, U extends SomeRepository , V ...> {

@Autowrired
@Accessors(fluent = true)
@Getter(PROTECTED)
private T serviceInstance;

// DOES NOT WORK!
@MockBean
@Accessors(fluent = true)
@Getter(PROTECTED)
private U repositoryInstance; // != serviceInstance.repositoryInstance();

}

但是在实际服务类的测试类中模拟Bean是可行的。

class OtherServiceTest extends SomeServiceTest<OtherService, OtherRepository, ...> {

@TestConfiguration
OtherServiceTestConfiguration {

    // WORKS!!!
    // == serviceInstance().repositoryInstance();
    @MockBean private OtherRepository repositoryInstance;
}

}

class AnotherServiceTest extends SomeServiceTest<AnotherService, AnotherRepository, ...> {

// WORKS!!!
// == serviceInstance().repositoryInstance();
@MockBean private AnotherRepository repositoryInstance;

}

我该如何模拟SomeServiceTest#repositoryInstance以便它引用与相同的对象SomeServiceTest#serviceInstance.repositoryInstance()?


问题来源:stackoverflo

展开
收起
七天一失眠 2020-04-11 15:47:00 1513 0
1 条回答
写回答
取消 提交回答
  • 做一个优秀的阿里云志愿者

    我不知道什么是@Autowire,因为我使用@Autowired。但是,据我所知,在对象声明中使用autowire是一种不好的做法。 代替:

    @Autowired MyObject myObject;

    在构造函数中使用它:

    Repository repository;

    @Autowired public SomeService(Repository repository) { this.repository = repository; }

    并且,在您的测试中:

    class SomeServiceTest {

    @Mock
    private Repository repositoryMock;
    
    private Service serviceUnderTest;
    
    @Before
    public void init() {
         MockitoAnnotations.initMocks(this);
         serviceUnderTest = new Service(repositoryMock);
    }
    

    答案来源:stackoverflow

    2020-04-11 15:47:23
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
移动互联网测试到质量的转变 立即下载
给ITer的技术实战进阶课-阿里CIO学院独家教材(四) 立即下载
F2etest — 多浏览器兼容性测试整体解决方案 立即下载