gpt4 book ai didi

java - 如何将模拟注入(inject)具有@Transactional 的@Service

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:11 25 4
gpt4 key购买 nike

我在我的单元测试中有任何问题,我有一些类似的东西。如果 blargh 函数被注释为 Transactional,模拟注入(inject)将在 someService 上被覆盖。如果我删除 Transactional,模拟将保留在那里。从代码中可以看出,当服务中的函数被注解为 transactinal 时,Spring 会延迟加载服务,但如果不是,则急切地加载服务。这会覆盖我注入(inject)的模拟。

有更好的方法吗?

@Component
public class SomeTests
{
@Autowired
private SomeService someService;

@Test
@Transactional
public void test(){
FooBar fooBarMock = mock(FooBar.class);
ReflectionTestUtils.setField(someService, "fooBar", fooBarMock);
}
}

@Service
public class someService
{
@Autowired FooBar foobar;

@Transactional // <-- this causes the mocked item to be overridden
public void blargh()
{
fooBar.doStuff();
}
}

最佳答案

或许您可以尝试以下列方式实现您的测试:

@Component
@RunWith(MockitoJUnitRunner.class)
public class SomeTests
{
@Mock private FooBar foobar;
@InjectMocks private final SomeService someService = new SomeService();


@Test
@Transactional
public void test(){
when(fooBar.doStuff()).then....;
someService.blargh() .....
}
}

我现在无法尝试,因为没有您的配置和相关代码。但这是测试服务逻辑的常用方法之一。

关于java - 如何将模拟注入(inject)具有@Transactional 的@Service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21124326/

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