Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MockBean不';在Spring boot集成测试中无法工作_Java_Spring Boot_Mocking - Fatal编程技术网

Java MockBean不';在Spring boot集成测试中无法工作

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

我有一个Spring集成测试,我试图模拟我的一些bean。出于某种原因,尽管我嘲笑了他们,但他们是无效的。下面是代码片段:

我想嘲笑的豆子

@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
,它位于包的根目录中