【发布时间】:2018-07-31 18:09:29
【问题描述】:
我正在使用 SpringBoot 1.5.9 并尝试进行集成测试。奇怪的是 MongoRepository.save() 方法在模拟 MongoRepository 上调用时会更新对象。
我有一个计数器类
public class Counter {
public String id;
public int seq;
public void increaseSeq() {
this.seq += 1;
}
}
还有他的仓库
public interface CounterRepository extends MongoRepository<Counter, String>{
Counter findById(String id);
List<Counter> findAll();
}
还有他的服务
@Service
public class CounterService {
@Autowired private CounterRepository counterRepository;
public Counter findCounter(String id) {
return counterRepository.findById(id);
}
public int getSeqAndIncrease(String id) {
Counter counter = findCounter(id);
if (counter == null) {
return -1;
}
counter.increaseSeq();
counterRepository.save(counter);
return counter.getSeq();
}
}
现在,当我进行系统集成并尝试模拟 counterRepository 时,它会发生一些我没想到的事情。 counterRepository.findById() 返回一个 Counter 对象,其中增加了 'seq' 字段。为什么? counterRepository.save() 是否以任何方式影响结果(counterRepository 被模拟,因此我认为 save() 不应该有任何影响)?
@RunWith(SpringRunner.class)
@SpringBootTest
public class FlowServiceTest {
@MockBean private CounterRepository counterRepository;
@Autowired private CounterService counterService;
@Before
public void setUp() {
Mockito.when(counterRepository.save(any(Counter.class))).then(arg -> arg.getArgumentAt(0, Counter.class));
Mockito.when(counterRepository.findById("flow")).thenReturn(new Counter("flow", 10));
}
@Test
public void testSavingInDatabase() {
System.out.println(counterRepository.findById("flow"));
counterService.getSeqAndIncreaseSafe("flow");
System.out.println(counterRepository.findById("flow"));
counterService.getSeqAndIncreaseSafe("flow");
System.out.println(counterRepository.findById("flow"));
}
}
它打印“10 11 12”。为什么不打印'10 10 10'?
【问题讨论】:
-
在你的测试类中你是如何初始化 counterService 的?
-
@pvpkiran 是的,我初始化了它;忘了写在问题中;不是我更新了它;您是否发现其他可能导致错误的内容?
标签: spring spring-mvc spring-boot spring-data spring-boot-test