为了账号安全,请及时绑定邮箱和手机立即绑定

运行 Mockito 测试时,Spring @Autowired 字段为空

运行 Mockito 测试时,Spring @Autowired 字段为空

梵蒂冈之花 2021-11-17 14:44:53
这是我的主要代码:@Servicepublic class MainService {    public String mainMethod() {        SomeService someService = new SomeService("required");        // do Sth.    }}@Service@RequiredArgsConstructorpublic class SomeService {    @Autowired    private SomeOtherService someOtherService;    @Notnull    private final String requiredField;    // ...}@Servicepublic class SomeOtherService {    // just a bunch of public methods that might as well be static}这是测试设置:@RunWith(SpringRunner.class)public class MainServiceTest {    @InjectMocks    private MainService mainService;    @Test    public void givenSth_whenSth_doSth() {        // test mainService.mainMethod();    }}你能告诉我为什么 SomeService 里面的 someOtherService 是空的吗?我发现当你使用 Spring 的注入时,你不应该同时使用手动实例化 (new ...);所以也许new SomeService("required")是问题所在?但是,如果不是通过构造函数调用,我如何将字段变量注入 SomeService?我不想使用 Builder,因为 requiredField 应该是 NotNull。
查看完整描述

2 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

对于集成测试,请考虑使用如下所示的上下文配置实例化 bean


@RunWith(SpringRunner.class)

@ContextConfiguration("mockito-config.xml")

详细解释请参考


https://blog.jayway.com/2011/11/30/spring-integration-tests-part-i-creating-mock-objects/

对于单元测试,请考虑使用 Mockito 提供的 @Mock 注释。


在这个特定的例子中,我们可以模拟 SomeOtherService 如下所示


 @RunWith(SpringRunner.class)

 public class MainServiceTest {


 @InjectMocks

 private MainService mainService;


 @Mock

 private SomeOtherService someOtherService


 @Test

 public void givenSth_whenSth_doSth() {

     // test mainService.mainMethod();

 }

}

详细解释请参考以下帖子


http://www.vogella.com/tutorials/Mockito/article.html

http://static.javadoc.io/org.mockito/mockito-core/2.23.0/org/mockito/MockitoAnnotations.html


查看完整回答
反对 回复 2021-11-17
?
MM们

TA贡献1886条经验 获得超2个赞

您可以按照 Adam Weidner 的教程使用MockBeanSpring Bean 并使用Spring 扩展AbstractTestNGSpringContextTestTestNG


@TestExecutionListeners(MockitoTestExecutionListener.class)

@SpringBootTest

public class WidgetServiceIntegrationTest extends AbstractTestNGSpringContextTest {

@MockBean private SprockService sprockService;

@MockBean private SpringService springService;

@Autowired WidgetService widgetService;

@Test

public void testSomethingOnWidgetService() {

     when(sprockService.makeASprock()).thenReturn(...);


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 414 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信