Giriş
MockServer yerine bir diğer seçenek WireMock
Maven
Şu satırı dahil ederiz
<dependency><groupId>org.mock-server</groupId><artifactId>mockserver-netty</artifactId><version>5.13.0</version></dependency><dependency><groupId>org.mock-server</groupId><artifactId>mockserver-client-java</artifactId><version>5.13.0</version></dependency>
Örnek
Şu satırı dahil ederiz
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mock-server</groupId> <artifactId>mockserver-spring-test-listener-no-dependencies</artifactId> <version>5.14.0</version> </dependency>
MockServerClient Sınıfı
Şu satırı dahil ederiz
import org.mockserver.client.MockServerClient;
when metodu
Şöyle yaparız
import static org.hamcrest.Matchers.is;
import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.HttpResponse.response;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import com.nimbusds.jose.jwk.RSAKey;
import com.pohorelov.medium.configuration.SecurityConfiguration;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPublicKey;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockserver.client.MockServerClient;
import org.mockserver.springtest.MockServerTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.context.annotation.Import;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.servlet.MockMvc;
@ActiveProfiles("test")
@MockServerTest
@WebMvcTest(controllers = BaseController.class)
class BaseControllerTest {
private MockServerClient mockServerClient;
@Autowired
private MockMvc mockMvc;
private static String jwks;
private static String jwt;
@BeforeAll
public static void setUp() {
final var keyPair = generateKeyPair();
jwks = generateJwksJson(keyPair);
jwt = authorize(keyPair);
}
@BeforeEach
public void setUpServer() {
mockServerClient
.when(
request()
.withMethod("GET")
.withPath("/auth/realms/test-realm/protocol/openid-connect/certs"))
.respond(response().withStatusCode(200).withBody(jwks));
}
@SneakyThrows
private static KeyPair generateKeyPair() {
final var keyGenerator = KeyPairGenerator.getInstance("RSA");
keyGenerator.initialize(1024);
return keyGenerator.generateKeyPair();
}
private static String generateJwksJson(KeyPair keyPair) {
final var rsaKey = new RSAKey.Builder((RSAPublicKey) keyPair.getPublic()).build();
final var jwk =
Map.of(
"kid", "test",
"kty", "RSA",
"alg", "RS256",
"n", rsaKey.getModulus().toString(),
"e", rsaKey.getPublicExponent().toString());
final var responseSet = Map.of("keys", List.of(jwk));
final var jsonObj = new JSONObject(responseSet);
return jsonObj.toString();
}
@SneakyThrows
private static String authorize(KeyPair keyPair) {
return Jwts.builder()
.setHeaderParam("kid", "test")
.signWith(SignatureAlgorithm.RS256, keyPair.getPrivate())
.claim("accountId", "1")
.claim("permissions", "base-controller-read")
.setExpiration(new Date(System.currentTimeMillis() + 5 * 60 * 1000))
.compact();
}
}Test kodu için şöyle yaparız
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.servlet.MockMvc;
@SneakyThrows
@Test
void shouldReturnAccountData() {
final var headers = new HttpHeaders();
headers.setBearerAuth(jwt);
mockMvc.perform(get("/accounts/1").headers(headers))
.andExpect(status().isOk())
.andExpect(jsonPath("$.accountName", is("Oleksandr Pohorelov")));
}
@SneakyThrows
@Test
void shouldReturnForbidden() {
final var headers = new HttpHeaders();
headers.setBearerAuth(jwt);
mockMvc.perform(get("/accounts/2").headers(headers))
.andExpect(status().isForbidden())
.andExpect(jsonPath("$.errorMessage",
is("Search account id is not associated with current user")));
}
verify metodu
Örnek
Şöyle yaparız. Böylece MockServer "http://localhost:1080/api/helloWorld" adresini dinler
public class MockServerConfig {
private static final Integer MOCK_SERVER_PORT = 1080;
private final ClientAndServer clientAndServer;
private final MockServerClient mockServerClient = new MockServerClient("localhost",
MOCK_SERVER_PORT);
MockServerConfig() {
this.clientAndServer = ClientAndServer.startClientAndServer(MOCK_SERVER_PORT);
}
public void registerHelloWorldEndpoint() {
mockServerClient
.when(
request()
.withMethod("GET")
.withPath("/api/helloWorld"),
exactly(1)
)
.respond(
response()
.withStatusCode(200)
.withBody("Mocked Response!!!!!!")
.withDelay(TimeUnit.SECONDS, 1)
);
}
public void verifyHelloWorldEndpoint() {
mockServerClient.verify(
request()
.withMethod("GET")
.withPath("/api/helloWorld"),
VerificationTimes.exactly(1)
);
}
public void stopServer() {
clientAndServer.stop();
}
}Test içinde kullanmak için şöyle yaparız
@SpringBootTest
@AutoConfigureMockMvc
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class DemoControllerE2ETest {
private MockServerConfig mockServerConfig;
@BeforeAll
public void startServer() {
mockServerConfig = new MockServerConfig();
mockServerConfig.registerHelloWorldEndpoint();
}
@AfterEach
public void tearDown() {
mockServerConfig.verifyHelloWorldEndpoint();
}
@AfterAll
public void tearDown() {
mockServerConfig.stopServer();
}
...
}
Hiç yorum yok:
Yorum Gönder