Me enfrenté a un problema al probar los repositorios de descanso de datos. Llamo al recurso de descanso y verifico si me da el json adecuado. Pero para los datos de prepoblación que no quiero usar en la base de datos de la memoria, me burlé de la invocación del método de repositorio.
@MockBean private CommentRepository commentRepository; e hizo esto

given(commentRepository.findOne(1L)).willReturn(comment);

Y ahora, mientras llamo "/ comments / 1" obtengo el error 404, por lo que el resto de datos no expuso mi repositorio. La pregunta principal es "¿Cómo podemos simular el método de repositorio para obtener datos de la base de datos?"
Mi clase de prueba:

    @RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class CommentTest
{
  @Autowired
  private TestRestTemplate restTemplate;

  @MockBean
  private CommentRepository commentRepository;

  @Before
  public void setup()
  {
    Comment comment = new Comment();
    comment.setText("description");
    comment.setCommentId(1L);

    given(commentRepository.findOne(1L)).willReturn(comment);
  }

  @Test
  public void shouldCheckCommentGetResource()
  {
    ParameterizedTypeReference<Resource<Comment>> responseType = new ParameterizedTypeReference<Resource<Comment>>() {};

    ResponseEntity<Resource<Comment>> responseEntity =
        restTemplate.exchange("/comments/1", HttpMethod.GET, null, responseType, Collections
            .emptyMap());

    Comment actualResult = responseEntity.getBody().getContent();
    assertEquals("description", actualResult.getText());
    // more assertions
  }
}

Según tengo entendido, al usar la anotación MockBean, reemplazo el bean del repositorio actual y no quedará expuesto por el resto de datos. ¿Tenemos alguna forma de rellenar previamente los datos en la base de datos o de invocación simulada del método del repositorio?

0
Dominic 15 dic. 2016 a las 02:18

2 respuestas

La mejor respuesta

No creo que esto sea posible. Spring Data registra los beans del repositorio usando un FactoryBean; en el caso de spring-data-rest, es EntityRepositoryFactoryBean. Por lo tanto, no puede simplemente anular estos frijoles con una simulación.

Para obtener una lectura interesante sobre por qué burlarse de los repositorios de datos de Spring no es útil, consulte esta respuesta https://stackoverflow.com/a/23442457/5371736 < / a>

En el mismo hilo hay una referencia a un proyecto que presenta soporte simulado para repositorios de datos de primavera: https://stackoverflow.com/a/ 28643025/5371736

1
Community 23 may. 2017 a las 10:30

Hay una forma rápida y sucia de simular los repositorios de Spring Data Rest con mockito, en caso de que alguien no tenga otras opciones, pero intente evitar esto a menos que sea absolutamente necesario

class MockRestRepositoryUtil {
    public static <T> T mockRepository(Class<T> repositoryClass,
                                        T springRepository) throws Exception {
        Object springRepositoryImpl = AopTestUtils.getTargetObject(springRepository);
        T mockRepository = mock(repositoryClass, delegatesTo(springRepositoryImpl));
        Object springProxyHandler = Proxy.getInvocationHandler(springRepository);
        ProxyFactory proxyFactory = extractProxyFactory(springProxyHandler);
        proxyFactory.setTarget(mockRepository);
        removeSpringDataAspects(proxyFactory);
        return mockRepository;
    }

    private static ProxyFactory extractProxyFactory(Object springProxyHandler) throws Exception {
        Field advisedField = springProxyHandler.getClass().getDeclaredField("advised");
        advisedField.setAccessible(true);
        return (ProxyFactory) advisedField.get(springProxyHandler);
    }

    private static void removeSpringDataAspects(ProxyFactory proxyFactory) {
        Advisor[] advisors = proxyFactory.getAdvisors();
        Arrays.stream(advisors)
            .filter(advisor -> advisor.getAdvice().getClass().getPackage().getName()
                .contains("org.springframework.data"))
            .collect(toImmutableList())
            .forEach(proxyFactory::removeAdvisor);
    }
}
0
user10166894user10166894 1 ago. 2018 a las 16:14