java - JUnit&Mockito : how to inject field values to Spring component?

标签 java spring spring-mvc junit mockito

我正在尝试测试 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)变量中的表名称:

  1. ReflectionTestUtils,无需进行模拟 spy Activity 。
  2. 使用Mockito的注解@Spy和@InjectMocks

但这不是非常可靠的集成测试,因为当有人更改table架构时,您的测试将无法捕获问题。有一些方法可以解决此类问题:

  1. 如果您的应用程序执行增量脚本将数据库架构和元数据迁移到最新版本(例如通过使用 Liquibase 或 FlyWay),您可以在测试和运行测试期间重新创建内存/嵌入式数据库中的数据库架构(例如 H2、HSQL)对照原始表。这是现代方法。
  2. 如果您的公司架构是老式的,其中一些 DBA 在您的应用部署上独立执行 SQL 增量脚本,则必须有一些 DEV DB 环境。使用该环境进行集成测试。您可以提前整理/准备表格以进行测试。

关于java - JUnit&Mockito : how to inject field values to Spring component?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32549071/

相关文章:

java - PlayFramework:json 反序列化性能不佳

java - 配置一个 XSD 由多个 xs :schemas? 组成

java - Spring 3.2 和 Hibernate 4 - 由于 SessionFactory 为空而获取 NullPointerException

java - Spring-Security-Ldap - 如何报告锁定帐户

Spring Boot 在启动时抛出 BeanCreationException

java - com.google.android.material :material:1. 1.0-alpha08 失败但 1.0.0 工作正常

java - 如何在事务类上 Autowiring ?

java - Spring Security - 在哪里设置默认用户的权限?

java - 如何将 JAXB 注释与 Spring RestTemplate 一起使用?

java - Maven 多配置文件部署在 WEB-INF/classes 中