Я использую последний плагин spring-boot-gradle-plugin 2.0 для написания модульных тестов. Короче говоря, я хотел написать модульный тест для init () postConstruct в следующем классе:
@Service
public class UserIdService implements IUserIdService
{
// Local store
private Map<String, Map<String, String>> store = new TreeMap<>();
@Autowired
private ResourceLoader resourceLoader;
private static final String CSV_FILE_LOCATION = "data/userid-data.csv";
@PostConstruct
public void init()
{
System.out.println("Loading data from CSV file to UserID Store...");
int totalRecords = 0;
Resource resource = resourceLoader.getResource("classpath:" + CSV_FILE_LOCATION);
try
{
InputStream inputStream = resource.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
Iterable<CSVRecord> records = CSVFormat.DEFAULT.parse(inputStreamReader);
for (CSVRecord record : records)
{
totalRecords++;
String number = record.get(0);
String context = record.get(1);
String name = record.get(2);
number = PhoneNumberHelper.convertPhoneNumber(number);
//add only valid numbers to store
if (!number.equals(PhoneNumberHelper.INVALID_INPUT))
{
add(new UserId(name, number, context));
}
}
}
catch (Exception e)
{
System.err.println("Can't load or parse CSV file: " + CSV_FILE_LOCATION);
}
System.out.println("Loaded total [ " + store.size() + " / " + totalRecords + " ] records.");
}
public boolean add(UserId record)
{
if (null == store.get(record.getNumber()))
{
Map<String, String> newContext = new TreeMap<>();
newContext.put(record.getContext(), record.getName());
store.put(record.getNumber(), newContext);
}
else
{
Map<String, String> currentContext = store.get(record.getNumber());
if (currentContext.get(record.getContext()) == null)
{
currentContext.put(record.getContext(), record.getName());
}
else
{
//context already exists for the phone number, throw error
System.err.println("Context already exists for the phone number: " + record.toString());
return false;
}
}
return true;
}
public List<UserId> get(String number)
{
List<UserId> result = new ArrayList<>();
if (null != store.get(number))
{
Map<String, String> currentContext = store.get(number);
for (Map.Entry<String, String> entry : currentContext.entrySet())
{
UserId record = new UserId(entry.getValue(), number, entry.getKey());
result.add(record);
}
}
return result;
}
public boolean contains(String number)
{
return store.containsKey(number);
}
}
Созданный мной тестовый класс выглядит так:
@SpringBootApplication
public class UserIdServiceTest {
@Autowired
private UserIdService userIdService;
@Test
public void testInit() throws Exception {
userIdService.init();
// assert things here..
}
@Test
public void testAdd() {
}
@Test
public void testGet() {
}
@Test
public void testContains() {
}
}
Когда я пытаюсь запустить его, тест не проходит:
UserIdServiceTest > testInit FAILED java.lang.NullPointerException at UserIdServiceTest.testInit(UserIdServiceTest.java:21)
Я занимаюсь этим несколько дней. Что мне не хватает? - Я хотел бы иметь возможность создавать тесты для описанных методов, но независимо от того, где я ссылаюсь на userIdService, я всегда получаю одно и то же исключение NullPointerException.
Спасибо, что посмотрели.
Спасибо. К сожалению, он по-прежнему не запускается. Теперь я получаю следующее: «Не удалось загрузить ApplicationContext java.lang.IllegalStateException: не удалось загрузить ApplicationContext». Я хожу по кругу несколько дней. Я перепробовал сотни вещей и комбинаций. Я готов сдаться.




Разве вам не нужно аннотировать свой тестовый класс с помощью
@RunWith(SpringRunner.class) @SpringBootTest