Почему проваливается тест?
Не могу понять как составить тест для метода, обновляющего товар.
Вот сам тест
@Test
public void updateProductFail(){
Product product = new Product();
product.setId(1L);
product.setProductName("Horseradish - Prepared");
boolean isProductUpdated = productService.updateProduct(product);
assertFalse(isProductUpdated);
}
Вот тестируемый метод
public boolean updateProduct(Product productForUpdate){
// ищием товар с таким же именем в БД
Product productFromDB = findProductByName(productForUpdate.getProductName());
if (productFromDB != null){
// если товар с таким именем нашёлся, проверяем, является ли это товар тем же самым
if (productFromDB.equals(productForUpdate)){
// если да, то обновляем данные и возращаем true
productRepository.save(productForUpdate);
return true;
}else return false; // иначе false
}
// если товар не нашёлся, просто обновляем данные и возращаем true
productRepository.save(productForUpdate);
return true;
}
Класс товара
package com.example.mywms.Model;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import javax.validation.constraints.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "product")
@Getter
@Setter
public class Product extends BaseEntity{
@NotBlank(message = "Поле не должно быть пустым")
private String productName;
@Enumerated(EnumType.STRING)
private ProductType productType;
@NotBlank(message = "Поле не должно быть пустым")
@Size(min = 10, max = 255, message = "Описание товара должно быть от 10 до 255 символов")
private String productDescription;
@Positive(message = "Цена товара не может быть меньше 0 или быть равной 0")
private double productPrice;
@PositiveOrZero(message = "Количесвто товара не может быть меньше 0")
private int productStock;
@Enumerated(EnumType.STRING)
private ProductStatus productStatus;
@ManyToMany
@JoinTable(
name = "product_delivery",
joinColumns = {
@JoinColumn(name = "product_id"),
},
inverseJoinColumns = @JoinColumn(name = "delivery_id")
)
private Set<Delivery> deliveriesProductIn = new HashSet<>();
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Product)) return false;
Product product = (Product) o;
return getId().equals(product.getId()) && getProductName().equals(product.getProductName());
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + getProductName().hashCode();
result = (int) (prime * result + getId());
return result;
}
}
Весь класс для теста
@RunWith(SpringRunner.class)
@SpringBootTest
class ProductServiceTest {
@Autowired
private ProductService productService;
@MockBean
private ProductRepository productRepository;
@Test
public void saveProduct() {
Product product = new Product();
boolean isProductAdded = productService.saveProduct(product);
assertTrue(isProductAdded);
assertEquals(ProductStatus.FREE_TO_DELIVER, product.getProductStatus());
Mockito.verify(productRepository, Mockito.times(1)).save(product);
}
@Test
public void saveProductFail() {
Product product = new Product();
product.setProductName("Серёжки");
Mockito.doReturn(product)
.when(productRepository)
.findByProductName("Серёжки");
boolean isProductAdded = productService.saveProduct(product);
assertFalse(isProductAdded);
}
@Test
public void updateProduct(){
Product product = new Product();
boolean isProductUpdated = productService.updateProduct(product);
assertTrue(isProductUpdated);
}
@Test
public void updateProductFail(){
Product product = new Product();
product.setId(1L);
product.setProductName("Horseradish - Prepared");
boolean isProductUpdated = productService.updateProduct(product);
assertFalse(isProductUpdated);
}
}
Ответы (1 шт):
Автор решения: denstran
→ Ссылка
Разобрался, нужно было сделать так
@Test
public void updateProductFail(){
Product productForUpdate = new Product();
productForUpdate.setId(1L);
productForUpdate.setProductName("Horseradish - Prepared");
Product product = new Product();
product.setId(2L);
product.setProductName("Horseradish - Prepared");
Mockito.doReturn(product)
.when(productRepository)
.findByProductName("Horseradish - Prepared");
boolean isProductUpdated = productService.updateProduct(productForUpdate);
assertFalse(isProductUpdated);
}