带有 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" 的模拟。我在这里配置错误了吗?
任何 CommandLineRunner
的 run
方法作为 SpringApplication
的一部分被调用 运行。当测试框架为您的测试引导应用程序上下文时,就会发生这种情况。至关重要的是,这是在您的测试方法对您的 MyCoolService
模拟设置任何期望之前。结果,当调用 talkToMe()
时,模拟 returns null
。
将您的问题简化为一个简单示例可能会遗漏一些内容,但我认为我不会在这里使用集成测试。相反,我会使用模拟服务对您的 CommandLineRunner
进行单元测试。为此,我建议转向构造函数注入,以便您可以将模拟直接传递到服务的构造函数中。
版本:
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" 的模拟。我在这里配置错误了吗?
任何 CommandLineRunner
的 run
方法作为 SpringApplication
的一部分被调用 运行。当测试框架为您的测试引导应用程序上下文时,就会发生这种情况。至关重要的是,这是在您的测试方法对您的 MyCoolService
模拟设置任何期望之前。结果,当调用 talkToMe()
时,模拟 returns null
。
将您的问题简化为一个简单示例可能会遗漏一些内容,但我认为我不会在这里使用集成测试。相反,我会使用模拟服务对您的 CommandLineRunner
进行单元测试。为此,我建议转向构造函数注入,以便您可以将模拟直接传递到服务的构造函数中。