junit 为什么测试类上的自动布线不起作用?

hgtggwj0  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(200)

我正在尝试为我的Sping Boot 应用程序编写一个测试方法,它在Zoom上创建一个会议。我以前没有做过任何单元测试,这是我第一次尝试。
我想在不同的场景(不同的会议类型)下测试我的服务的create方法,为了测试它,我需要我的MeetingService接口,当我尝试用Lombok的@RequiredArgsConstructor自动连接它时;我收到以下错误消息:
异常错误类型:没有为构造函数[公共技术.观察对象.缩放.缩放集成服务应用程序测试(技术.观察对象.缩放.服务.会议服务,技术.观察对象.缩放.配置.帐户配置)]中的参数[技术.观察对象.缩放.服务.会议服务arg 0]注册参数解析器。

缩放集成服务应用程序测试:

package tech.obss.zoom;

@SpringBootTest
@RunWith(SpringRunner.class)
@RequiredArgsConstructor
@ActiveProfiles("test")
class ZoomIntegrationServiceApplicationTests {
    private final MeetingService meetingService;
    private final AccountConfig accountConfig;

    @ParameterizedTest
    @ValueSource(ints = { 1, 2, 3, 4 })
    void createMeeting(int type) {
        User user = User.builder().email(accountConfig.getEmail()).userId(accountConfig.getUserId()).build();
        meetingService.createMeeting(...);
    }

}

我已经看到了一个解决方案,通过使用@BeforeEach注解和自己创建服务。但是,我的MeetingService在其构造函数上有另外5个不同的类,这5个类有不同的依赖关系。这就是为什么我很难这样做。

会议服务实作:

@Service
@Slf4j
@RequiredArgsConstructor
public class MeetingServiceImpl implements MeetingService {
    private static final Duration REQUEST_TIMEOUT = Duration.ofSeconds(3);

    private final MeetingRepository meetingRepository;
    private final CreateMeetingRepository createMeetingRepository;
    private final WebClient zoomWebClient;
    private final MeetingMapper meetingMapper;
    private final AccountConfig accountConfig;

    @Override
    public MeetingDto createMeeting(CreateMeeting createMeeting) {
      ...
    }
}

有没有更简单的方法来解决这个问题?

8hhllhi2

8hhllhi21#

您看到的异常是由您的测试类ZoomIntegrationServiceApplicationTests被JUnit示例化的事实引起的。JUnit不知道您的Spring服务,这就是为什么它不知道如何解析测试类的构造函数的参数(您可以从异常的名称以org.junit...开头这一事实推断出这一点)
解决这个问题最简单的方法是从测试类中删除@RequiredArgsConstructor注解,并使用@Autowired注解字段,如下所示:

@Autowired
private MeetingService meetingService;
@Autowired
private AccountConfig accountConfig;

Spring还有一个@TestConstructor注解,可以用于运行JUnit Junipter测试的应用程序。

相关问题