120 lines
4.7 KiB
Java
120 lines
4.7 KiB
Java
package com.example.service;
|
|
|
|
import com.example.exception.GeminiClientException;
|
|
import com.example.service.base.GeminiClientService;
|
|
import com.google.genai.Client;
|
|
import com.google.genai.errors.GenAiIOException;
|
|
import com.google.genai.types.Content;
|
|
import com.google.genai.types.GenerateContentConfig;
|
|
import com.google.genai.types.GenerateContentResponse;
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
import org.junit.jupiter.api.Test;
|
|
import org.junit.jupiter.api.extension.ExtendWith;
|
|
import org.mockito.Answers;
|
|
import org.mockito.InjectMocks;
|
|
import org.mockito.Mock;
|
|
import org.mockito.junit.jupiter.MockitoExtension;
|
|
|
|
import java.io.IOException;
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
|
import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.when;
|
|
|
|
@ExtendWith(MockitoExtension.class)
|
|
class GeminiClientServiceTest {
|
|
|
|
|
|
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
|
private Client geminiClient;
|
|
|
|
@InjectMocks
|
|
private GeminiClientService geminiClientService;
|
|
|
|
private String prompt;
|
|
private Float temperature;
|
|
private Integer maxOutputTokens;
|
|
private String modelName;
|
|
private Float top_P;
|
|
|
|
@BeforeEach
|
|
void setUp() {
|
|
prompt = "Test prompt";
|
|
temperature = 0.5f;
|
|
maxOutputTokens = 100;
|
|
modelName = "gemini-test-model";
|
|
top_P=0.85f;
|
|
|
|
}
|
|
|
|
@Test
|
|
void generateContent_whenApiSucceeds_returnsGeneratedText() throws GeminiClientException {
|
|
// Arrange
|
|
String expectedText = "This is the generated content.";
|
|
GenerateContentResponse mockResponse = mock(GenerateContentResponse.class);
|
|
when(mockResponse.text()).thenReturn(expectedText);
|
|
when(geminiClient.models.generateContent(anyString(), any(Content.class), any(GenerateContentConfig.class)))
|
|
.thenReturn(mockResponse);
|
|
|
|
String actualText = geminiClientService.generateContent(prompt, temperature, maxOutputTokens, modelName,top_P);
|
|
assertEquals(expectedText, actualText);
|
|
}
|
|
|
|
@Test
|
|
void generateContent_whenApiResponseIsNull_throwsGeminiClientException() {
|
|
// Arrange
|
|
when(geminiClient.models.generateContent(anyString(), any(Content.class), any(GenerateContentConfig.class)))
|
|
.thenReturn(null);
|
|
|
|
GeminiClientException exception = assertThrows(GeminiClientException.class, () ->
|
|
geminiClientService.generateContent(prompt, temperature, maxOutputTokens, modelName,top_P)
|
|
);
|
|
|
|
assertEquals("No content generated or unexpected response structure.", exception.getMessage());
|
|
}
|
|
|
|
@Test
|
|
void generateContent_whenResponseTextIsNull_throwsGeminiClientException() {
|
|
GenerateContentResponse mockResponse = mock(GenerateContentResponse.class);
|
|
when(mockResponse.text()).thenReturn(null);
|
|
when(geminiClient.models.generateContent(anyString(), any(Content.class), any(GenerateContentConfig.class)))
|
|
.thenReturn(mockResponse);
|
|
|
|
GeminiClientException exception = assertThrows(GeminiClientException.class, () ->
|
|
geminiClientService.generateContent(prompt, temperature, maxOutputTokens, modelName,top_P)
|
|
);
|
|
|
|
assertEquals("No content generated or unexpected response structure.", exception.getMessage());
|
|
}
|
|
|
|
@Test
|
|
void generateContent_whenGenAiIOExceptionOccurs_throwsGeminiClientException() {
|
|
// Arrange
|
|
String errorMessage = "Network issue";
|
|
when(geminiClient.models.generateContent(anyString(), any(Content.class), any(GenerateContentConfig.class)))
|
|
.thenThrow(new GenAiIOException(errorMessage, new IOException()));
|
|
|
|
GeminiClientException exception = assertThrows(GeminiClientException.class, () ->
|
|
geminiClientService.generateContent(prompt, temperature, maxOutputTokens, modelName,top_P)
|
|
);
|
|
|
|
assertTrue(exception.getMessage().startsWith("An API communication issue occurred:"));
|
|
assertTrue(exception.getMessage().contains(errorMessage));
|
|
}
|
|
|
|
@Test
|
|
void generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException() {
|
|
when(geminiClient.models.generateContent(anyString(), any(Content.class), any(GenerateContentConfig.class)))
|
|
.thenThrow(new RuntimeException("Something went wrong"));
|
|
|
|
GeminiClientException exception = assertThrows(GeminiClientException.class, () ->
|
|
geminiClientService.generateContent(prompt, temperature, maxOutputTokens, modelName,top_P)
|
|
);
|
|
|
|
assertEquals("An unexpected issue occurred during content generation.", exception.getMessage());
|
|
}
|
|
} |