Java MockBean不';在Spring boot集成测试中无法工作
我有一个Spring集成测试,我试图模拟我的一些bean。出于某种原因,尽管我嘲笑了他们,但他们是无效的。下面是代码片段: 我想嘲笑的豆子Java MockBean不';在Spring boot集成测试中无法工作,java,spring-boot,mocking,Java,Spring Boot,Mocking,我有一个Spring集成测试,我试图模拟我的一些bean。出于某种原因,尽管我嘲笑了他们,但他们是无效的。下面是代码片段: 我想嘲笑的豆子 @Component public class MockWS { public String callSoapClient() throws JAXBException{ return "CallSoapCl"; } } 使用Bean的类 public class SmDpES2PortImpl implements ES
@Component
public class MockWS {
public String callSoapClient() throws JAXBException{
return "CallSoapCl";
}
}
使用Bean的类
public class SmDpES2PortImpl implements ES2SmDp {
@Autowired
private MockWS mock;
@Override
public void es2DownloadProfile(ES2DownloadProfileRequest parameters) {
try {
LOG.info("\n\n\n TEST BEAN: " + mock.callSoapClient() + "\n\n");
}
}
}
模拟Bean的Spring引导集成测试
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ES2SmDpApplicationTests {
@MockBean(name="mockWS")
MockWS mockService;
@Test
public void test1Es2DownloadProfile_Sucess() throws MalformedURLException, JAXBException, SOAPException {
when(mockService.callSoapClient()).thenReturn("CallMockCLient");
}
}
构建执行的输出:测试BEAN:null您应该模拟接口,而不是类。另外,
SmDpES2PortImpl
必须是Springbean。请尝试以下操作:
接口:
public interface IMockWS {
public String callSoapClient() throws JAXBException;
}
组件类别:
@Component
public class MockWS implements IMockWS {
@Override
public String callSoapClient() throws JAXBException{
return "CallSoapCl";
}
}
服务类别:
@Service //Also @Component is a good alternative
public class SmDpES2PortImpl implements ES2SmDp {
@Autowired
private IMockWS mock; //Notice that you are wiring an interface
@Override
public void es2DownloadProfile(ES2DownloadProfileRequest parameters) {
try {
LOG.info("\n\n\n TEST BEAN: " + mock.callSoapClient() + "\n\n");
}
}
}
测试等级:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ES2SmDpApplicationTests {
@MockBean
IMockWS mockService; //Again, you are mocking the interface, not the implementing class
@Test
public void test1Es2DownloadProfile_Sucess() throws MalformedURLException, JAXBException, SOAPException {
when(mockService.callSoapClient()).thenReturn("CallMockCLient");
}
}
您应该模拟接口,而不是类。另外,
SmDpES2PortImpl
必须是Springbean。请尝试以下操作:
接口:
public interface IMockWS {
public String callSoapClient() throws JAXBException;
}
组件类别:
@Component
public class MockWS implements IMockWS {
@Override
public String callSoapClient() throws JAXBException{
return "CallSoapCl";
}
}
服务类别:
@Service //Also @Component is a good alternative
public class SmDpES2PortImpl implements ES2SmDp {
@Autowired
private IMockWS mock; //Notice that you are wiring an interface
@Override
public void es2DownloadProfile(ES2DownloadProfileRequest parameters) {
try {
LOG.info("\n\n\n TEST BEAN: " + mock.callSoapClient() + "\n\n");
}
}
}
测试等级:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ES2SmDpApplicationTests {
@MockBean
IMockWS mockService; //Again, you are mocking the interface, not the implementing class
@Test
public void test1Es2DownloadProfile_Sucess() throws MalformedURLException, JAXBException, SOAPException {
when(mockService.callSoapClient()).thenReturn("CallMockCLient");
}
}
在我的例子中,以下注释组合起作用:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { ControllerThatIAmTesting.class })
@AutoConfigureMockMvc(addFilters = false) // if using MockMvc object
但是我必须在带有@MockBean注释的测试类中显式声明我在ControllerHatiamTesting中使用的两个自连线对象——否则Spring会抱怨它找不到合适的实现——顺便说一句,我的接口和它们的实现都在相同的对应包中
此外,使用@WebMvcTest而不是@SpringBootTest(其他人建议将其作为更具体的场景)导致Spring无法从我的@Configuration类中找到并初始化其他一些@Autowired依赖项
相关帖子在我的案例中,以下注释组合起作用:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { ControllerThatIAmTesting.class })
@AutoConfigureMockMvc(addFilters = false) // if using MockMvc object
但是我必须在带有@MockBean注释的测试类中显式声明我在ControllerHatiamTesting中使用的两个自连线对象——否则Spring会抱怨它找不到合适的实现——顺便说一句,我的接口和它们的实现都在相同的对应包中
此外,使用@WebMvcTest而不是@SpringBootTest(其他人建议将其作为更具体的场景)导致Spring无法从我的@Configuration类中找到并初始化其他一些@Autowired依赖项
相关帖子谢谢分享。我完全按照你写的那样做了,但是对象仍然是空的。看起来问题可能是其他原因造成的,比如Spring或其他原因。您是否仍在使用
@MockBean(name=“mockWS”)
?我认为你不需要说出豆子的名字。另外,可能您必须检查@SpringBootApplication
注释的位置,可能您的组件扫描有问题代码>。关于@SpringBootApplication
,它位于packageThank you for the share的根目录中。我完全按照你写的那样做了,但是对象仍然是空的。看起来问题可能是其他原因造成的,比如Spring或其他原因。您是否仍在使用@MockBean(name=“mockWS”)
?我认为你不需要说出豆子的名字。另外,可能您必须检查@SpringBootApplication
注释的位置,可能您的组件扫描有问题代码>。关于@springbootplication
,它位于包的根目录中