Java 弹簧自注入及mockito测试
我们使用的是Spring5.2.x(带SpringBoot2.3.x)和Mockito3.3.x 我需要从服务中调用Java 弹簧自注入及mockito测试,java,spring,spring-boot,junit,mockito,Java,Spring,Spring Boot,Junit,Mockito,我们使用的是Spring5.2.x(带SpringBoot2.3.x)和Mockito3.3.x 我需要从服务中调用@Transactional方法。因此,我不得不求助于自我注射 @Service @RequiredArgsCostructor // lombok public class MyClass { private final dep1; private final dep2; @Autowired private MyClass self;
@Transactional
方法。因此,我不得不求助于自我注射
@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使用构造函数注入。由于明显的原因,我无法将实例变量self
声明为final
,因此我使用了@Autowired
来进行此操作。该类工作正常,但我发现单元测试存在问题
我的问题有两个部分-
self
引入一个setter,并使用它在setup方法中注入self。不希望仅为测试添加setterReflectionUtils
设置self
。我觉得倒影是不干净的。比起这个,我更喜欢@Setter
@RunWith(SpringJunit4Runner.class)
,但正如预期的那样失败了,因为我没有创建正确的上下文和内容在setUp()方法中调用ReflectionTestUtils.setField(myClass,“self”,myClass)这可能是将服务和someTransactionalMethod()重构为不同类以便可以模拟的好例子吗?
someTransactionalMethod
在该服务中定义良好。只是为了测试,不要认为重构是个好主意。我已经提到过,这不是我想继续使用的方法。