使用 Mockito 模拟时无法调用带有@PostConstruct注释的方法



我正在尝试使用 Junit 和 Mockito 为存储库层类编写单元测试。我嘲笑了提供 NamedParameterJdbcOperations 的基类,并试图注入到 repo 类中。在 repo 类中,我们从类路径上的文件加载 sql 查询。这是在用@PostConstruct注释的方法中完成的。尝试测试存储库的方法时,它无法找到或加载查询,从而引发 NullPointerException。

需要有关如何处理这种情况的帮助/建议。

PS:我不允许更改存储库类实现。

附加存储库和测试类的代码以供参考。

RepositoryImpl.java

@Repository
public class RepositoryImpl extends AppJdbcImpl implements
    Repository {
private static final StudentMapper STUDENT_ROW_MAPPER = new StudentMapper();
private static final CourseMapper COURSE_ROW_MAPPER = new CourseMapper();
@Value("classpath:sql/sql1.sql")
private Resource sql1;
private String query1;
@Value("classpath:sql/sql2.sql")
private Resource sql2;
private String query2;
public RepositoryImpl() { }
public RepositoryImpl(NamedParameterJdbcOperations jdbc) {
    super(jdbc);
}
@PostConstruct
public void setUp() {
    query1 = loadSql(sql1);
    query2 = loadSql(sql2);
}
public Iterable<Course> findCoursesByStudentId(int studentId) throws
    DataAccessException {
    try {
        return jdbc().queryForObject(query1,
            ImmutableMap.of("studentId", studentId),
            COURSE_ROW_MAPPER);
    } catch (EmptyResultDataAccessException emptyResult) {
        return null;
    } catch (DataAccessException e) {
        // Need to create exception classes and throw specific exceptions
        throw e;
    }
}
public Iterable<Student> findStudentsByCourseId(int courseId) throws DataAccessException {
    try {
        return jdbc().query(query2,
            ImmutableMap.of("courseId", courseId),
            STUDENT_ROW_MAPPER);
    } catch (DataAccessException e) {
        // Need to create exception classes and throw specific exceptions
        throw e;
    }
}
private String loadSql(Resource resource) {
    try {
        return CharStreams.toString(new InputStreamReader(resource.getInputStream()));
    } catch (IOException e) {
        return null;
    }
}

}

RespositoryImplTest.java

@RunWith(MockitoJUnitRunner.class)
public class RepositoryImplTest {
@Mock
private NamedParameterJdbcOperations jdbc;
@Mock
private ResultSet resultSet;
@Mock
private StudentMapper studentMapper;
@Mock
private CourseMapper CourseMapper;
@InjectMocks
private RepositoryImpl repository;
private Student student1;
private Student student2;
private Course course1;
private Course course2;
@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
    course1 = new Course(1, "Karate");
    course2 = new Course(2, "Riding");
    course8 = new Course(8, "Swimming");
    List<Course> courseList = Arrays.asList(course1, course2, course8);
    student1 = new Student(1, "Chuck", "Norris", 27, new Arrays.asList(course1, course2));
    student2 = new Student(2, "Bruce", "Lee", 54, new Arrays.asList(course1, course8));
    List<Student> studentList = Arrays.asList(student1, student2);
    when(jdbc.queryForObject(Matchers.anyString(), anyMap(),
        isA(StudentMapper.class)))
        .thenAnswer(new Answer() {
            @Override
            public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
                Object[] args = invocationOnMock.getArguments();
                int queryParam = Integer.parseInt(args[0].toString());
                Iterable<Credentials> result = studentList.stream()
                .filter(d -> d.getId() == queryParam)
                .collect(Collectors.toList());
                return result;
            }
        });
}
@Test
public void findCoursesByStudentId() {
    Iterable<Course> result = repository.findCoursesByStudentId(1);
    assertNotNull(result);
}

}

在存储库类中,当查询 1 为 null 时,将引发异常。

需要帮助才能正确解决问题。

谢谢,巴鲁

@RunWith(MockitoJUnitRunner.class)

您使用 Mockito 启动器而不是弹簧启动器开始测试。意思是春天没有给你豆子。Mockito入门对PostConstruct注释一无所知。

您可以在 sturUp junit 方法或测试方法中调用 PostConstruct 方法。

相关内容

  • 没有找到相关文章

最新更新