Как лучше написать этот преобразователь строк [закрыто]JAVA

Программисты JAVA общаются здесь
Anonymous
Как лучше написать этот преобразователь строк [закрыто]

Сообщение Anonymous »

Я работаю над приложением Spring Batch и реализовал собственный Partitioner, чтобы разделить обработку на несколько потоков. У меня возникли проблемы с написанием теста JUnit 4 для моего partition метод. Я издевался над своим DataSource и JdbcTemplate, но я не уверен, что я утверждаю правильные условия или правильна ли моя настройка. Этот код проверяет количество вхождений чего-либо, что может быть чем угодно, от записей до событий, как указано методом по dto (объекту передачи данных). Вот что делает логика, описанная простыми словами:
Код запрашивает у dto количество вхождений с помощью метода dto.getNumOfOccur().
Если количество вхождений равно нулю (это означает, что вхождений не было), код устанавливает для dto статус «НОВЫЙ», указывая, что все, что проверяется, является новым или не происходило ранее.
Если какое-либо число больше нуля (это означает, что произошло хотя бы одно событие), статус устанавливается на «СУЩЕСТВУЕТ», что указывает на то, что событие не является новым и происходило раньше.
Этот статус устанавливается с помощью метода dto.setNeworexist() с указанием «NEW» или «EXISTS» в качестве
```
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.test.MetaDataInstanceFactory;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.nio.file.*;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.List;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

@RunWith(SpringRunner.class)
public class CollectionLettersFinalAggregatorTaskletTest {

@InjectMocks
private CollectionLettersFinalAggregatorTasklet tasklet;

@Mock
private M2MDynamicConfigPropertiesRepository dynamicConfigPropRepository;

@Mock
private StepContribution stepContribution;

@Mock
private ChunkContext chunkContext;

@Mock
private StepContext stepContext;

private static final String SOURCE_DIR = "src/test/resources/source";
private static final String DEST_DIR = "src/test/resources/dest";

@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(chunkContext.getStepContext()).thenReturn(stepContext);
when(stepContext.getStepExecution()).thenReturn(MetaDataInstanceFactory.createStepExecution());
stepContext.getStepExecution().getJobExecution().getExecutionContext().putString("sourceDir", SOURCE_DIR);
stepContext.getStepExecution().getJobExecution().getExecutionContext().putString("destDir", DEST_DIR);
}

@Test
public void testExecuteWeekday() throws Exception {
try (MockedStatic mockedLocalDate = mockStatic(LocalDate.class)) {
LocalDate testDate = LocalDate.of(2023, 8, 2); // Assume this is a Wednesday
mockedLocalDate.when(LocalDate::now).thenReturn(testDate);

createTestFiles(SOURCE_DIR, CollectionLettersFinalAggregatorTasklet.WEEKDAY_FILES);

RepeatStatus status = tasklet.execute(stepContribution, chunkContext);

assertEquals(RepeatStatus.FINISHED, status);
verifyFileContent(DEST_DIR, "FinalLetter.txt", CollectionLettersFinalAggregatorTasklet.WEEKDAY_FILES);

cleanUpTestFiles(SOURCE_DIR, CollectionLettersFinalAggregatorTasklet.WEEKDAY_FILES);
cleanUpTestFiles(DEST_DIR, List.of("FinalLetter.txt"));
}
}

@Test
public void testExecuteWeekend() throws Exception {
try (MockedStatic mockedLocalDate = mockStatic(LocalDate.class)) {
LocalDate testDate = LocalDate.of(2023, 8, 5); // Assume this is a Saturday
mockedLocalDate.when(LocalDate::now).thenReturn(testDate);

createTestFiles(SOURCE_DIR, CollectionLettersFinalAggregatorTasklet.WEEKEND_FILES);

RepeatStatus status = tasklet.execute(stepContribution, chunkContext);

assertEquals(RepeatStatus.FINISHED, status);
verifyFileContent(DEST_DIR, "FinalLetter.txt", CollectionLettersFinalAggregatorTasklet.WEEKEND_FILES);

cleanUpTestFiles(SOURCE_DIR, CollectionLettersFinalAggregatorTasklet.WEEKEND_FILES);
cleanUpTestFiles(DEST_DIR, List.of("FinalLetter.txt"));
}
}

@Test(expected = IllegalStateException.class)
public void testValidateDirectoryPath_NullPath() {
tasklet.validateDirectoryPath(null);
}

@Test(expected = IllegalStateException.class)
public void testValidateDirectoryPath_EmptyPath() {
tasklet.validateDirectoryPath("");
}

@Test(expected = IllegalStateException.class)
public void testValidateDirectoryPath_SameSourceAndDest() {
stepContext.getStepExecution().getJobExecution().getExecutionContext().putString("sourceDir", SOURCE_DIR);
stepContext.getStepExecution().getJobExecution().getExecutionContext().putString("destDir", SOURCE_DIR);

tasklet.execute(stepContribution, chunkContext);
}

@Test
public void testValidateDirectoryPath_ValidPath() {
tasklet.validateDirectoryPath(SOURCE_DIR);
}

@Test
public void testIsWeekend() {
assertTrue(tasklet.isWeekend(DayOfWeek.SATURDAY));
assertTrue(tasklet.isWeekend(DayOfWeek.SUNDAY));
assertTrue(tasklet.isWeekend(DayOfWeek.MONDAY));
assertFalse(tasklet.isWeekend(DayOfWeek.WEDNESDAY));
}

@Test
public void testAggregateFinalLetter_IOException() throws IOException {
createTestFiles(SOURCE_DIR, CollectionLettersFinalAggregatorTasklet.WEEKDAY_FILES);

// Simulate an IOException
Path filePath = Paths.get(SOURCE_DIR, CollectionLettersFinalAggregatorTasklet.WEEKDAY_FILES.get(0));
filePath.toFile().setReadable(false);

try {
tasklet.aggregateFinalLetter(SOURCE_DIR, DEST_DIR, CollectionLettersFinalAggregatorTasklet.WEEKDAY_FILES);
} catch (Exception e) {
// Catch and assert the exception
} finally {
filePath.toFile().setReadable(true); // Restore file permissions for cleanup
cleanUpTestFiles(SOURCE_DIR, CollectionLettersFinalAggregatorTasklet.WEEKDAY_FILES);
}
}

private void createTestFiles(String dir, List fileNames) throws IOException {
for (String fileName : fileNames) {
Path filePath = Paths.get(dir, fileName);
Files.createDirectories(filePath.getParent());
Files.write(filePath, ("Header\nContent of " + fileName + "\nFooter").getBytes());
}
}

private void verifyFileContent(String dir, String fileName, List expectedFileNames) throws IOException {
Path filePath = Paths.get(dir, fileName);
List lines = Files.readAllLines(filePath);
int expectedLineCount = expectedFileNames.size() * 3; // Each file has 3 lines: Header, Content, Footer
assertEquals(expectedLineCount, lines.size());
}

private void cleanUpTestFiles(String dir, List fileNames) throws IOException {
for (String fileName : fileNames) {
Path filePath = Paths.get(dir, fileName);
Files.deleteIfExists(filePath);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... better-way

Вернуться в «JAVA»