我正在尝试测试 Spring @Repository
组件,但首先我必须注入(inject)表名称以使其正常工作。
这是我做的。这是简单的 DAO:
@Repository
@Transactional
public class AccountDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
private String table = "accounts"; <-- I need to inject this value from tests
...
}
单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-web-servlet.xml")
@Transactional
public class AccountDaoTest {
@Autowired
private AccountDAO accountDAO;
@Before
public void init() {
accountDAO = Mockito.spy(accountDAO);
ReflectionTestUtils.setField(accountDAO, "table", "accounts_test");
}
...
}
问题是 ReflectionTestUtils
忽略字段分配,并且 accountDAO
仍然使用 accounts
表名称值而不是 accounts_test
.
如何解决这个问题?
最佳答案
您可以使用两种技术来更改存储在私有(private)变量中的表名称:
ReflectionTestUtils
,无需进行模拟 spy Activity 。- 使用Mockito的注解@Spy和@InjectMocks
但这不是非常可靠的集成测试,因为当有人更改table
架构时,您的测试将无法捕获问题。有一些方法可以解决此类问题:
- 如果您的应用程序执行增量脚本将数据库架构和元数据迁移到最新版本(例如通过使用 Liquibase 或 FlyWay),您可以在测试和运行测试期间重新创建内存/嵌入式数据库中的数据库架构(例如 H2、HSQL)对照原始表。这是现代方法。
- 如果您的公司架构是老式的,其中一些 DBA 在您的应用部署上独立执行 SQL 增量脚本,则必须有一些 DEV DB 环境。使用该环境进行集成测试。您可以提前整理/准备表格以进行测试。
关于java - JUnit&Mockito : how to inject field values to Spring component?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32549071/