我们使用的是 Spring 5.2.x(带有 Spring Boot 2.3.x)和 Mockito 3.3.x。
我需要拨打 @Transactional
我的服务中的方法。因此我不得不求助于自我注入(inject)。
@Service
@RequiredArgsCostructor // lombok
public class MyClass {
private final dep1;
private final dep2;
@Autowired
private MyClass self;
public void someMethod() {
self.someTransactionalMethod();
// do something
}
@Transactional
public void someTransactionalMethod() {
// do something
}
}
public class MyClassTest {
@Mock
private dep1;
@Mock
private dep2;
@InjectMocks
private MyClass myClass;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void someMethodTest() {
// NPE when calling self.someTransactionalMethod()
}
}
从代码中可以看出,我们正在使用 lombok 使用构造函数注入(inject)。出于显而易见的原因,我无法声明实例变量 self
如 final
,因此使用 @Autowired
对于这个。该类(class)工作正常,但我发现单元测试存在问题。我的问题有两部分 -
我已经考虑了以下几点:
self
引入一个 setter并使用它在设置方法中注入(inject)自我。不想只为测试添加 setter。 ReflectionUtils
设置 self
.反射对我来说似乎是不干净的。我更喜欢 @Setter
在这个。 @RunWith(SpringJunit4Runner.class)
但这按预期失败了,因为我没有创建适当的上下文和内容。 最佳答案
在 setUp() 方法中调用 ReflectionTestUtils.setField(myClass, "self", myClass)
关于java - spring中的 self 注入(inject)并使用mockito进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63187187/