![](/img/trans.png)
[英]Spring Boot @Autowired in unit test returns NullPointerException
[英]Unit Testing Hibernate with DB, test returns nullpointerexception
我用ORM(休眠)編寫Rest Api,現在我想測試該服務邏輯。 我正在嘗試模擬我的數據庫的實體,但效果不佳。 我的選擇是與Mockito一起使用,但是現在我對此有所懷疑。 通常我從編寫的測試中獲取NullPointerException。 我應該以另一種方式(不同方式“模擬”該數據庫)編寫Junit測試,還是我不了解Hibernate?
這是我的代碼:測試類
public class ItemServiceImplTest {
@Spy
private ItemServiceImplementation itemServImpl;
@Mock
private BasketRepository basketRepository;
@Mock
private ItemRepository itemRepository;
@Mock
private Basket basket;
@Spy
private Item item;
@Before
public void setupMock() {
MockitoAnnotations.initMocks(this);
itemServImpl = new ItemServiceImplementation();
itemServImpl.setItemRepository(itemRepository);
itemServImpl.setBasketRepository(basketRepository);
}
@Test
public void testShowBasket() {
Iterable<Basket> element = basketRepository.findAll();
when(itemServImpl.showBasket()).thenReturn(element);
Iterable<Basket> elementOne = itemServImpl.showBasket();
assertThat(elementOne, is(equalTo(element)));
}
@Test
public void testAddToBasketStringInt() {
Item a = new Item("A", 40, 70, 3);
Basket testObjOne = new Basket(3, 70, a);
when(itemServImpl.addToBasket("A", 3)).thenReturn((Iterable<Basket>) basketRepository.save(testObjOne));
Iterable<Basket> zzz = itemServImpl.addToBasket("A", 3);
assertThat(zzz, is(equalTo(testObjOne)));
}
楷模
@Entity
public class Item {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
private String name;
private int price;
private int specialPrice;
private int qtyToDiscount;
public Item(){};
public Item(String name, int price, int specialPrice, int qtyToDiscount) {
this.name = name;
this.price = price;
this.specialPrice = specialPrice;
this.qtyToDiscount = qtyToDiscount;
}
@Entity
public class Basket {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long orderId;
private int quantity;
private int cost;
@OneToOne
@JoinTable(name = "BASKET_ORDERS", joinColumns = { @JoinColumn(name = "ORDER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ID") })
private Item item;
public Basket() {
}
public Basket(int quantity, int cost,Item items) {
this.quantity = quantity;
this.cost = cost;
this.item = items;
}
服務
@Service("itemService")
@Transactional
public class ItemServiceImplementation implements ItemCRUDService, ItemCostService, ItemFindService {
public static final Logger logger = LoggerFactory.getLogger(ItemServiceImplementation.class);
@Autowired
public void setItemRepository(ItemRepository itemRepository) {
this.itemRepository = itemRepository;
}
@Autowired
public void setBasketRepository(BasketRepository basketRepository) {
this.basketRepository = basketRepository;
}
private BasketRepository basketRepository;
private ItemRepository itemRepository;
public Iterable<Basket> showBasket() {
return basketRepository.findAll();
}
public Iterable<Basket> addToBasket(String name, int qty) {
if (basketRepository.exists(itemRepository.findOne(findItem(name).getId()).getId())==false) {
logger.info("add to empty list");
basketRepository.save(new Basket(qty, itemCost(name, qty), findItem(name)));
logger.info("adding");
}
modifyOrder(findItem(name).getId(), qty);
itemCost(name, qty);
logger.info("modify");
return showBasket();
}
public Item findItem(String name) {
for (Item item : itemRepository.findAll()) {
if (item.getName().equals(name)) {
return item;
}
}
return null;
}
public int itemCost(String name, int qty) {
int price = 0;
int modulo = qty % findItem(name).getSpecialPrice();
price = findItem(name).getPrice() * modulo
+ findItem(name).getSpecialPrice() * ((qty - modulo) / `findItem(name).getSpecialPrice());`
return price;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.