Как использовать сопоставители MyBatis в тестах Spring JUnit? - PullRequest
0 голосов
/ 30 сентября 2018

Для тестов я использую:

  • Spring Test 3.2.3.RELEASE
  • JUnit 4.12
  • Mockito 1.10.19

Следующий тестовый код должен сохранить некоторую сущность в базе данных, однако этого не происходит:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ControllerTestConfig.class})
public class ControllerTest {

    @Autowired
    SomeMapper someMapper;

    @Test
    public void shouldCreateSomeEntity() {
        SomeEntity someEntity = new SomeEntity();
        someEntity.setSomeProperty("property");
        ...

        someMapper.createSomeEntity(someEntity);
    }

    ...
}   

Я использую смоделированную реализацию маппера:

@Configuration
public class ControllerTestConfig {

    @Bean
    public SomeMapper SomeMapper() {
        return Mockito.mock(SomeMapper.class);
    }

    ...
}

Поскольку реализациямоделируется, вызов метода перехватывается в классе org.mockito.internal.creation.cglib.MethodInterceptorFilter.

. Отображатель является интерфейсом:

public interface SomeMapper {

    @Insert("Insert into some_table (id, some_entity_id, type, full_name) values (#{id}, #{someEntityId}, #{type}, #{fullName})")
    @SelectKey(statement="select nextval('seqid_static_data');", keyProperty="id", before=true, resultType=long.class)
    void createSomeEntity(SomeEntity someEntity);

    ...
}

Таким образом, невозможно создать экземпляр этого преобразователя.Например, следующим образом:

@Bean
public SomeMapper SomeMapper() {
    return new SomeMapper();
}

...

Как использовать сопоставители MyBatis в тестах Spring JUnit?

Буду очень признателен за информацию.

Спасибо всем.

1 Ответ

0 голосов
/ 01 октября 2018

Вы пытались эмулировать вызов метода с помощью doAnswer или doThrow, они должны работать с void методами.Например:

@Test
public void shouldCreateSomeEntity() {
    SomeEntity someEntity = new SomeEntity();
    someEntity.setSomeProperty("property");       

    Mockito.doAnswer(invocation -> {
           invocation.getArgument(0).setSomeProperty("changed_property")
        }).when(someMapper).createSomeEntity(Mockito.eq(someEntity));

    someMapper.createSomeEntity(someEntity);
    Assert.assertEquals("changed_property", someEntity.getSomeProperty());
}
...