как протестировать сервлет при момощи мокита?
Подскажите как протестировать мой сервлет. Тест должен показать правильно ли был выбран из трёх вариантов бин.
public class Book {
private String title;
private Float price;
private String description;
private String number;
public Book(){
}
public Book(String title, Float price, String description){
this.title = title;
this.price = price;
this.description = description;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("Book{");
sb.append("title='").append(title).append('\'');
sb.append(", price=").append(price);
sb.append(", description='").append(description).append('\'');
sb.append(", number='").append(number).append('\'');
sb.append('}');
return sb.toString();
}
}
import javax.inject.Inject;
@Loggable
public class BookService {
@Inject
@ThirteenDigits
private NumberGenerator numberGenerator;
public Book createBook(String title, Float price, String description) {
Book book = new Book(title, price, description);
book.setNumber(numberGenerator.generateNumber());
return book;
}
}
import javax.inject.Qualifier;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface EightDigits {
}
import javax.inject.Inject;
import java.util.Random;
import java.util.logging.Logger;
@ThirteenDigits
public class IsbnGenerator implements NumberGenerator {
@Inject
private Logger logger;
@Loggable
public String generateNumber() {
String isbn = "13-84356-" + Math.abs(new Random().nextInt());
logger.info("Generated ISBN : " + isbn);
return isbn;
}
}
import javax.inject.Inject;
import java.util.Random;
import java.util.logging.Logger;
@EightDigits
public class IssnGenerator implements NumberGenerator {
@Inject
private Logger logger;
@Loggable
public String generateNumber() {
String issn = "8-" + Math.abs(new Random().nextInt());
logger.info("Generated ISBN : " + issn);
return issn;
}
}
Java
import javax.interceptor.InterceptorBinding;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@InterceptorBinding
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
}
import javax.inject.Inject;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
import java.util.logging.Logger;
@Loggable
@Interceptor
public class LoggingInterceptor {
@Inject
private Logger logger;
@AroundInvoke
public Object logMethod(InvocationContext ic) throws Exception{
System.out.println("Aaaaaaaaaaaaa");
logger.entering(ic.getTarget().getClass().getName(), ic.getMethod().getName());
try {
return ic.proceed();
} finally {
logger.exiting(ic.getTarget().getClass().getName(), ic.getMethod().getName());
}
}
}
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import java.util.logging.Logger;
public class LoggingProducer {
@Produces
public Logger produceLogger(InjectionPoint injectionPoint){
return Logger.getLogger(injectionPoint.getMember().getName());
}
}
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Sasha")
public class Main extends HttpServlet {
@Inject
BookService bookService;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Book book = bookService.createBook("H2G2", 12.5f, "Geeky scifi Book");
System.out.println(book);
}
}
public interface NumberGenerator {
String generateNumber();
}
import javax.inject.Qualifier;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface ThirteenDigits {
}
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class BookServiceIT extends Mockito {
// мой попытки
@Inject
BookService bookService;
@Test
public void shouldCheckNumberIsMock() throws ServletException, IOException {
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
// when(request.getParameter()).thenReturn();
new Main().doGet(request, response);
Book book = bookService.createBook("H2G2", 12.5f, "Geeky scifi Book");
Assert.assertTrue(book.getNumber().startsWith("MOCK"));
}
}
import javax.enterprise.inject.Alternative;
import javax.inject.Inject;
import java.util.Random;
import java.util.logging.Logger;
@Alternative
@ThirteenDigits
public class MockGenerator implements NumberGenerator {
//клас для тестирование
@Inject
private Logger logger;
@Loggable
@Override
public String generateNumber() {
String mock = "MOCK-" + Math.abs(new Random().nextInt());
logger.info("Generated Mock : " + mock);
return mock;
}
}