使用 MockitoJUnitRunner 进行测试时的空服务

null service when testing with MockitoJUnitRunner

我的 Spring 启动应用程序中有这个测试,但是当我 运行 测试时,boniUserService 为 null

  @RunWith(MockitoJUnitRunner.class)
    public class BoniUserServiceTest {
        
        private BoniUserService boniUserService;
        
    
        @Test
        public void getUserById() {
    
            boniUserService.getUserById("ss");
    
        }
    }

您需要启动应用程序上下文才能使其工作,这可以通过使用 @SpringBootTest 注释来实现,然后您需要使用 @Autowired 注释来注入您的服务。像这样:

@SpringBootTest
@RunWith(MockitoJUnitRunner.class)
public class BoniUserServiceTest {
    
    @Autowired
    private BoniUserService boniUserService;
    

    @Test
    public void getUserById() {

        boniUserService.getUserById("ss");

    }
}

您使用 @RunWith 注释指定的测试运行器指定谁将处理您的测试中的注释 class。他们在您的测试 class 中处理注释并为您模拟对象。在你的情况下,你已经用 @RunWith(MockitoJUnitRunner.class) 注释了你的 class 所以你的 class 中应该有一些 Mockito 的注释由 MockitoJUnitRunner 处理。为了实现您的目标,您可以通过 @MockBean 注释来注释您的 bean。

@RunWith(MockitoJUnitRunner.class)
public class BoniUserServiceTest {

    @MockBean
    private BoniUserService boniUserService;
    

    @Test
    public void getUserById() {

        boniUserService.getUserById("ss");

    }
}

请注意,在这种方法中,不会加载 Spring 应用程序的上下文。通常您希望根据其他组件的模拟行为来测试您的组件之一。所以通常你是这样实现的:

@RunWith(SpringRunner.class)
@SpringBootTest
public class BoniUserServiceTest {
    
    @Autowired
    private BoniUserService boniUserService;

    @MockBean
    private BoniUserRepository boniUserRepository;
    

    @Test
    public void getUserById() {
        given(this.boniUserRepository.getUserFromRepository()).willReturn(new BoinoUsr("test"));
        boniUserService.getUserById("ss");

    }
}