gpt4 book ai didi

java - 如何测试@Cacheable?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:20 28 4
gpt4 key购买 nike

我正在努力在 Spring Boot 集成测试中测试 @Cacheable。这是我学习如何进行集成测试的第二天,我发现的所有示例都使用旧版本。我还看到了 assetEquals("some value", is()) 的示例,但没有任何导入语句可以知道"is"属于哪个依赖项。第二次测试失败

这是我的集成测试....

@RunWith(SpringRunner.class)
@DataJpaTest // used for other methods
@SpringBootTest(classes = TestApplication.class)
@SqlGroup({
@Sql(executionPhase = ExecutionPhase.BEFORE_TEST_METHOD,
scripts = "classpath:data/Setting.sql") })
public class SettingRepositoryIT {

@Mock
private SettingRepository settingRepository;

@Autowired
private Cache applicationCache;


@Test
public void testCachedMethodInvocation() {
List<Setting> firstList = new ArrayList<>();
Setting settingOne = new Setting();
settingOne.setKey("first");
settingOne.setValue("method invocation");
firstList.add(settingOne);

List<Setting> secondList = new ArrayList<>();
Setting settingTwo = new Setting();
settingTwo.setKey("second");
settingTwo.setValue("method invocation");
secondList.add(settingTwo);

// Set up the mock to return *different* objects for the first and second call
Mockito.when(settingRepository.findAllFeaturedFragrances()).thenReturn(firstList, secondList);

// First invocation returns object returned by the method
List<Setting> result = settingRepository.findAllFeaturedFragrances();
assertEquals("first", result.get(0).getKey());

// Second invocation should return cached value, *not* second (as set up above)
List<Setting> resultTwo = settingRepository.findAllFeaturedFragrances();
assertEquals("first", resultTwo.get(0).getKey()); // test fails here as the actual is "second."

// Verify repository method was invoked once
Mockito.verify(settingRepository, Mockito.times(1)).findAllFeaturedFragrances();
assertNotNull(applicationCache.get("findAllFeaturedFragrances"));

// Third invocation with different key is triggers the second invocation of the repo method
List<Setting> resultThree = settingRepository.findAllFeaturedFragrances();
assertEquals(resultThree.get(0).getKey(), "second");
}
}

ApplicationContext、组件、实体、存储库和用于测试的服务层。我之所以这样做是因为这个maven模块作为依赖被其他模块使用了。

@ComponentScan({ "com.persistence_common.config", "com.persistence_common.services" })
@EntityScan(basePackages = { "com.persistence_common.entities" })
@EnableJpaRepositories(basePackages = { "com.persistence_common.repositories" })
@SpringBootApplication
public class TestApplication {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

缓存配置....

@Configuration
@EnableCaching
public class CacheConfig {

public static final String APPLICATION_CACHE = "applicationCache";

@Bean
public FilterRegistrationBean registerOpenSessionInViewFilterBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
OpenEntityManagerInViewFilter filter = new OpenEntityManagerInViewFilter();
registrationBean.setFilter(filter);
registrationBean.setOrder(5);
return registrationBean;
}


@Bean
public Cache applicationCache() {
return new GuavaCache(APPLICATION_CACHE, CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.DAYS)
.build());
}
}

正在测试的存储库....

public interface SettingRepository extends JpaRepository<Setting, Integer> {

@Query(nativeQuery = true, value = "SELECT * FROM Setting WHERE name = 'featured_fragrance'")
@Cacheable(value = CacheConfig.APPLICATION_CACHE, key = "#root.methodName")
List<Setting> findAllFeaturedFragrances();
}

最佳答案

SettingRepositoryIT 的第一个问题是,字段settingRepository 上的@Mock 注释。这对于任何正常测试、集成测试或任何其他测试都是自相矛盾的。

您应该让 Spring 为 class-under-test 引入依赖项,在您的例子中是 SettingRepository

请看这个例子,@Autowired 是如何用于 class-under-test,在这个例子中是 OrderService:

@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from the
// static nested Config class
@ContextConfiguration
public class OrderServiceTest {

@Configuration
static class Config {

// this bean will be injected into the OrderServiceTest class
@Bean
public OrderService orderService() {
OrderService orderService = new OrderServiceImpl();
// set properties, etc.
return orderService;
}
}

@Autowired
private OrderService orderService;

@Test
public void testOrderService() {
// test the orderService
}

}

获取包含完整示例的文档:§ 15. Integration Testing

第二个问题是您不必测试@Cachable。您应该只测试您的实现。这是 Oliver Gierke 提供的关于如何测试它的一个很好的例子:How to test Spring's declarative caching support on Spring Data repositories?

关于java - 如何测试@Cacheable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43948434/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com