我在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){}
}
客户端在EntityListener组件中使用并静态设置。这可能导致不稳定吗?
{{1}}
答案 0 :(得分:1)
在IntelliJ中一起运行测试时,测试的应用程序上下文可能会在测试之间共享。如果上下文的某些部分受到测试本身的影响,甚至加载了上下文,这可能会导致问题。
您可以尝试使用@DirtiesContext
注释所有测试类,以确保为每个测试类加载新的应用程序上下文。如果需要,此注释也可以在@Test
方法的方法级别使用。