嘲弄豆并不总是有效

时间:2018-02-07 14:05:45

标签: java spring-boot intellij-idea junit

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

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

这可能是产生此行为的测试数量(500+)吗?

@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);
    }
}

修改

这里的错误: 它试图连接到我的领事,以获得通往我的微服务的路线。它没有必要,因为FeignClient应该被嘲笑。

public abstract class BaseResourceTest
{

    @MockBean
    protected FileserverClient fileserverClient;

    public BaseResourceTest()
    {
        MyCurrentTenantIdentifierResolver.forceTenantId("junit");
    }

    @Before
    public void initMockBeans(){
        given(fileserverClient.createFrom64(any(File64.class)))
        .willReturn(FileCreatorForTest.createFile());

    }
}

我尝试了除了一个以外的所有测试文件,它可以工作。我选择排除的一个并禁用另一个它的工作(我玩这个游戏很长一段时间,试图找到一个可能导致这个问题的测试文件)。

执行潜在失败测试的代码:

@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());
        }
    }

}

我的BaseResourceTest:

static {
    try {
        throw new RuntimeException();
    }
    catch (IllegalArgumentException ignored){}
}

编辑2

客户端在EntityListener组件中使用并静态设置。这可能导致不稳定吗?

{{1}}

1 个答案:

答案 0 :(得分:1)

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

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