Spock testowanie i zmokowanie metody

0

Klasa testowa

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class RestaurantServiceAddRestaurantTest extends Specification {

    private final static String DB_URL_PROPERTIES = "spring.datasource.url"
    private final static String DB_URL = "jdbc:postgresql://localhost:%d/restaurantDb?currentSchema=restaurant"

    @Shared
    PgSqlContainer pgSqlContainer
    static PgSqlContainer pgSqlContainerStatic
    @Autowired
    RestaurantEntry restaurantEntry
    @Autowired
    RestaurantRepository restaurantRepository

    @DynamicPropertySource
    static void postgresProperties(DynamicPropertyRegistry registry) {
        registry.add(DB_URL_PROPERTIES, { ->
            String.format(DB_URL, pgSqlContainerStatic.getPort())
        })
    }

    def setupSpec() {
        pgSqlContainer = new PgSqlContainer()
        pgSqlContainer.startContainer()
        pgSqlContainerStatic = pgSqlContainer
    }

    RestaurantDto prepareRestaurantDto(String name){
        RestaurantDto restaurantDto = new RestaurantDto()
        restaurantDto.setName(name)
        return restaurantDto
    }

    def "is PostgresSql working properly"() {
        expect:
        pgSqlContainer.isRunning()
    }

    def "should add restaurant for user"() {
        given:
        def restaurantDto = prepareRestaurantDto("name")
        when:
        restaurantEntry.addRestaurant(restaurantDto)
        then:
        restaurantRepository.findAll().size() == 1
    }
}

Chodzi mi o metodę "should add restaurant for user" przy dodawaniu restauracji pobieram Id z headera.
W serwisie (RestaurantService) który implementuje RestaurantEntry jest metoda i tutaj nie mogę sobie poradzić jak to zmokować żeby zwracała jakąś wartość aktualnie lecie exception.

UUID getUserIdFromRequest(){
        return UUID.fromString(request.getHeader("id"));
}
5

Generalnie to jest wtórny problem i jak w większości przypadków wskazuje na błędny design. Warstwa serwisów nie powinna mieć świadomości i grzebać w jakichś headerach. Wygrzeb tego idka w kontrolerze i przekaż do serwisu. Dzięki temu nie musisz nic mockować.

0

A czemu nie testujesz tego integracyjnie, wysyłając request http do kontrolera, skoro operujesz tam jakimiś wartościami z headerów?

0
Charles_Ray napisał(a):

Generalnie to jest wtórny problem i jak w większości przypadków wskazuje na błędny design. Warstwa serwisów nie powinna mieć świadomości i grzebać w jakichś headerach. Wygrzeb tego idka w kontrolerze i przekaż do serwisu. Dzięki temu nie musisz nic mockować.

Dziękuje bardzo już przenoszę do kontrollera to.

1

To tak jeszcze na przyszłość - ten ownerId powinien lecieć albo w body (nie w headerze), albo - jeśli to jest zalogowany user - nie być w ogóle przesyłany w req i pobierasz go z security contextu (Principal w Spring MVC).

0
Charles_Ray napisał(a):

To tak jeszcze na przyszłość - ten ownerId powinien lecieć albo w body (nie w headerze), albo - jeśli to jest zalogowany user - nie być w ogóle przesyłany w req i pobierasz go z security contextu (Principal w Spring MVC).

Tak tylko miałem problem z tym że: to jest mikroserwis. Na gatewayu (zuul) filtruje zapytania i już po filtrowaniu nie mam widocznego Principala(null) w serwisach.
Nie działało też przez zastosowanie **sensitiveHeaders: **
Przez to na gatewayu zrobiłem taki myczek.

addIdToZuulHeader(context, claims.get("id", String.class));

Może masz pomysł na to ?

1

Powinno działać https://stackoverflow.com/questions/36359915/authorization-header-not-passed-by-zuulproxy-starting-with-brixton-rc1

Ja bym się przedebugował przez Zuula i usługę, zobaczył jakie headery tam przychodzą. Może whitelistujesz nieodpowiedni header? Może to sensitiveHeaders nie jest włączone? Jest jakaś adnotacja od tego? A może usługi nie potrafią ustawić Principala, bo nie masz skonfigurowanego Spring Security?

1 użytkowników online, w tym zalogowanych: 0, gości: 1