如何在JUnit测试中强制执行模拟的自动装配字段的重写方法?

时间:2019-05-11 21:41:16

标签: java spring-boot junit spring-test

我有一个CacheInterceptor类,它扩展了HandlerInterceptorAdapter。此类具有自动连接的缓存:

// CacheInterceptor.java
public class CacheInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private Cache<String, String> myCache;

    ...
}

此bean定义发生在CachingConfiguration类中。在该类内部,由于项目需要其他行为,因此我重写了Cache write方法。

// CachingConfiguration.java
public class CachingConfiguration {

    @Bean(name = "myCache")
    public Cache<String, String> getMyCache() {
        ...

        CacheWriter<String, String> writer = new CacheWriter<String, String>() {

            @Override
            public void write(String key, String value) throws Exception {
                object.persist();
                ...
            }
    }
}

然后我有一个CacheInterceptorTest类,在其中模拟了MyCache,因为在某些情况下需要强制返回值。

// CacheInterceptorTest.java
@ContextConfiguration(classes = {
        CachingConfiguration.class
})

public class CacheInterceptorTest {

    @MockBean
    private Cache<String, String> myCache;
}

这适用于我的大多数测试。但是,有一项特定的测试需要在将值放入Cache时调用getMyCache内部的write()方法。但是因为我在嘲笑它,所以它使用的是Cache.write()的原始实现。

我该如何实现?

1 个答案:

答案 0 :(得分:0)

模拟是一个独立的实现,它没有覆盖的方法,因此无法“强制”执行任何操作。

根据您要在测试中实现的目标,可以使用不同的解决方案。

简单的解决方案可以是在junit测试中使用真实的缓存,或者始终对真实存储进行读写的虚拟(非模拟)缓存。