带有 MockBean 的 SpringBootTest 没有返回我所期望的

SpringBootTest with MockBean is not returning what I expect

版本:

Java: 1.8
Spring Boot: 1.5.4.RELEASE

主要应用程序:

@SpringBootApplication
public class SpringbootMockitoApplication implements CommandLineRunner {
    @Autowired
    MyCoolService myCoolService;

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMockitoApplication.class, args);
    }

    @Override
    public void run(String... strings) throws Exception {
        System.out.println(myCoolService.talkToMe());
    }
}

我的服务接口:

public interface MyCoolService {
  public String talkToMe();
}

我的服务实施:

@Service
public class MyCoolServiceImpl implements MyCoolService {

  @Override
  public String talkToMe() {
    return "Epic Win";
  }
}

我的测试class:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMockitoApplicationTests {

    @MockBean
    private MyCoolService myCoolService;

    @Test
    public void test() {
        when(myCoolService.talkToMe()).thenReturn("I am greater than epic");

    }

}

预期输出:我比史诗更伟大 实际输出:null

我只是想将上下文中的 bean 实例替换为将 return "I am greater than epic" 的模拟。我在这里配置错误了吗?

任何 CommandLineRunnerrun 方法作为 SpringApplication 的一部分被调用 运行。当测试框架为您的测试引导应用程序上下文时,就会发生这种情况。至关重要的是,这是在您的测试方法对您的 MyCoolService 模拟设置任何期望之前。结果,当调用 talkToMe() 时,模拟 returns null

将您的问题简化为一个简单示例可能会遗漏一些内容,但我认为我不会在这里使用集成测试。相反,我会使用模拟服务对您的 CommandLineRunner 进行单元测试。为此,我建议转向构造函数注入,以便您可以将模拟直接传递到服务的构造函数中。