Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 嘲弄豆并不总是有效的_Java_Spring Boot_Intellij Idea_Junit - Fatal编程技术网

Java 嘲弄豆并不总是有效的

Java 嘲弄豆并不总是有效的,java,spring-boot,intellij-idea,junit,Java,Spring Boot,Intellij Idea,Junit,我在junit测试中遇到了一个奇怪的行为。 对于一些测试,我需要模拟microservice客户端bean。 我使用BDDMockito.given来模拟微服务响应。 当我在IntelliJ中运行所有测试时,使用此选项的测试都会失败,因为客户端试图从微服务加载。 当我重新运行那些失败的测试时,它是有效的 我尝试启动自定义选定的测试,但找不到另一个导致这些测试失败的测试 这可能是产生这种行为的测试500+的数量吗 @MockBean protected FileserverClient files

我在junit测试中遇到了一个奇怪的行为。 对于一些测试,我需要模拟microservice客户端bean。 我使用BDDMockito.given来模拟微服务响应。 当我在IntelliJ中运行所有测试时,使用此选项的测试都会失败,因为客户端试图从微服务加载。 当我重新运行那些失败的测试时,它是有效的

我尝试启动自定义选定的测试,但找不到另一个导致这些测试失败的测试

这可能是产生这种行为的测试500+的数量吗

@MockBean
protected FileserverClient fileserverClient;

@Before
public void initMockBeans(){
    given(fileserverClient.createFrom64(any(File64.class)))
        .willReturn(FileCreatorForTest.createFile());
}
编辑 这里的错误是: 它正在尝试连接到我的领事,以获取到我的微服务的路径。不必这样,因为假装的客户应该被嘲笑过

2018-02-07 14:52:58.325  WARN 22665 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'retryableRibbonLoadBalancingHttpClient' defined in org.springframework.cloud.netflix.ribbon.apache.HttpClientRibbonConfiguration: Unsatisfied dependency expressed through method 'retryableRibbonLoadBalancingHttpClient' parameter 2; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ribbonLoadBalancer' defined in org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.netflix.loadbalancer.ILoadBalancer]: Factory method 'ribbonLoadBalancer' threw exception; nested exception is com.ecwid.consul.transport.TransportException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:8500 [localhost/127.0.0.1] failed: Connexion refusée (Connection refused)
2018-02-07 14:52:58.333 ERROR 22665 --- [           main] o.z.p.spring.web.advice.AdviceTrait      : Internal Server Error
我尝试启动所有测试文件,除了一个,它可以工作。我选择排除的一个,并禁用另一个它的工作我玩了这个游戏很长时间,试图找到一个测试文件,可能会导致这一点

潜在失败测试的示例代码:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MeetingApp.class,SecurityBeanOverrideConfiguration.class})
public class MeetingRoomResourceIntTest extends BaseResourceTest {

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        final MeetingRoomResource meetingRoomResource = new MeetingRoomResource(meetingRoomService, meetingRoomQueryService);
        this.restMeetingRoomMockMvc = MockMvcBuilders.standaloneSetup(meetingRoomResource)
            .setCustomArgumentResolvers(pageableArgumentResolver)
            .setControllerAdvice(exceptionTranslator)
            .setConversionService(createFormattingConversionService())
            .setMessageConverters(jacksonMessageConverter).build();
    }
    @Test
    @Transactional
    public void createMeetingRoom() throws Exception {
        int databaseSizeBeforeCreate = meetingRoomRepository.findAll().size();
        // Create the MeetingRoom
        MeetingRoomDTO meetingRoomDTO = meetingRoomMapper.toDto(meetingRoom);
        meetingRoomDTO.setFile64(FileCreatorForTest.createFile64());
        restMeetingRoomMockMvc.perform(post("/api/meeting-rooms")
            .contentType(TestUtil.APPLICATION_JSON_UTF8)
            .content(TestUtil.convertObjectToJsonBytes(meetingRoomDTO)))
            .andExpect(status().isCreated());

        // Validate the MeetingRoom in the database
        List<MeetingRoom> meetingRoomList =     meetingRoomRepository.findAll();
        assertThat(meetingRoomList).hasSize(databaseSizeBeforeCreate + 1);
        MeetingRoom testMeetingRoom = meetingRoomList.get(meetingRoomList.size() - 1);
        assertThat(testMeetingRoom.getMdLocationId()).isEqualTo(DEFAULT_MD_LOCATION_ID);
        assertThat(testMeetingRoom.getFspictureId()).isEqualTo(FileCreatorForTest.DEFAULT_FS_PICTURE_ID.intValue());
        assertThat(testMeetingRoom.getName()).isEqualTo(DEFAULT_NAME);
        assertThat(testMeetingRoom.getDescription()).isEqualTo(DEFAULT_DESCRIPTION);
        assertThat(testMeetingRoom.getCapacity()).isEqualTo(DEFAULT_CAPACITY);
        assertThat(testMeetingRoom.isNaturalDayLight()).isEqualTo(DEFAULT_NATURAL_DAY_LIGHT);
        assertThat(testMeetingRoom.isPamFriendly()).isEqualTo(DEFAULT_PAM_FRIENDLY);
        assertThat(testMeetingRoom.getStars()).isEqualTo(DEFAULT_STARS);
        assertThat(testMeetingRoom.getWrapUpTime()).isEqualTo(DEFAULT_WRAP_UP_TIME);
    }
}
编辑2 客户端在EntityListener组件中使用,并静态设置。这会导致不稳定吗

@Component
public class FileServerDependantListener {


    private Logger logger;

    static private FileserverClient fileserverClient;

    private AbstractFileServerDependantEntity entity;

    public FileServerDependantListener() {
        logger = Logger.getLogger(FileServerDependantListener.class.getName());

    }

    @Autowired
    public void init(FileserverClient fileserverClient){
        FileServerDependantListener.fileserverClient = fileserverClient;

    }

    @PreUpdate
    @PrePersist
    public void preCommit(AbstractFileServerDependantEntity entity){
        if (entity.getFile64() != null)  {
            entity.getFile64().setFileType(entity.getFileType());
            File file = fileserverClient.createFrom64(entity.getFile64());
            entity.setFsPictureId(file.getId());
        }
    }

}

在IntelliJ中同时运行测试时,测试的应用程序上下文可能在测试之间共享。如果部分上下文受测试本身甚至上下文加载的影响,这可能会导致问题


您可以尝试使用@DirtiesContext注释所有测试类,以确保为每个测试类加载新的应用程序上下文。如果需要,此注释也可以在@Test methods的方法级别上使用。

您会遇到什么错误?您还可以发布带有类注释的测试类代码吗?它可以工作,但会降低测试速度。我将使用它来隔离污染上下文的测试。
@Component
public class FileServerDependantListener {


    private Logger logger;

    static private FileserverClient fileserverClient;

    private AbstractFileServerDependantEntity entity;

    public FileServerDependantListener() {
        logger = Logger.getLogger(FileServerDependantListener.class.getName());

    }

    @Autowired
    public void init(FileserverClient fileserverClient){
        FileServerDependantListener.fileserverClient = fileserverClient;

    }

    @PreUpdate
    @PrePersist
    public void preCommit(AbstractFileServerDependantEntity entity){
        if (entity.getFile64() != null)  {
            entity.getFile64().setFileType(entity.getFileType());
            File file = fileserverClient.createFrom64(entity.getFile64());
            entity.setFsPictureId(file.getId());
        }
    }

}