Насколько я понимаю, если мы используем стереотипы Spring, нам не нужно использовать ключевое слово new для создания экземпляра. Spring управляет этим за нас и предоставляет нам bean-компоненты во время выполнения.
И для того, чтобы Spring мог внедрить эти bean-компоненты, нам нужно использовать аннотацию @Autowired
там, где мы хотим, чтобы Spring внедрил этот bean-компонент. Ниже у меня очень простой класс, в котором я использую @Component
, чтобы Spring справился с этим. В этом классе есть один список, который я инициализирую под свою ответственность, а затем небольшой метод, который выполняет некоторые логические операции c.
@Slf4j
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
public class Parser {
private List<String> strList = new ArrayList<>();
public void parseStrings(final String[] strs) {
Arrays.stream(strs)
.map(String::toLowerCase)
.filter(str -> str.length() > 8)
.filter(str -> str.endsWith("sam"))
.forEach(sam1 -> { strList.add(sam1); });
}
}
Я также написал один модульный тест для проверки этого, и вот он.
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.beans.factory.annotation.Autowired;
import static org.junit.jupiter.api.Assertions.*;
@RunWith(MockitoJUnitRunner.class)
class ParserTest {
@Autowired
private Parser parser;
@Test
void parseStrings() {
String str[] = {"abcsamsam", "abcsyjhgfed abdul sam","abcAhgbkgdjhul samad", "abcabjhgdulsamsam", "sa"};
parser.parseStrings(str);
assertTrue(parser.getStrList().size() == 3);
assertTrue(parser.getStrList().get(0).equalsIgnoreCase("abcsamsam"));
}
}
Тест не проходит с
java.lang.NullPointerException
, когда он пытается вызвать метод parseStrings
, что означает, что он не может ввести надлежащий инициализированный bean-компонент во время выполнения.
Может ли кто-нибудь помочь мне в том, чего мне не хватает? Нужно ли добавлять конструкторы (которые здесь я делаю с использованием аннотаций ломбока) при использовании стереотипов Spring в классе.