Spock jak to przetestować - test service

0

Koledzy podpowiedzcie jak przetestować w Spock mój serwis z dao ? Chciałbym przetestować metody findAll i findProductByBarcode

@Service
public class ProductServiceImpl implements ProductService {


    private ProductDao productDao;


    @Autowired
    public ProductServiceImpl(ProductDao productDao) {

        this.productDao = productDao;
    }



    public Collection<Product> findAll() {

        return productDao.findAll();
    }



    public ProductDto findProductByBarcode(String barcode) {

        return productDao.findProductByBarcode(barcode);
    }


}

Do tego mam Dao :

@Repository
@Log
public class ProductDaoImpl implements ProductDao {



    private final JdbcTemplate jdbcTemplate;


    @Autowired
    public ProductDaoImpl(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void dropCreateTable() {
        log.info("Creat table");
        jdbcTemplate.execute("DROP TABLE PRODUCTS IF EXISTS");
        jdbcTemplate.execute("CREATE TABLE PRODUCTS(" +
                "ID INT,NAME VARCHAR(100),BARCODE VARCHAR(20),PRICE DECIMAL )");
    }

    public void insertInToTable() {

        log.info("Insert into table");
        jdbcTemplate.batchUpdate("INSERT INTO PRODUCTS (ID,NAME,PRICE,BARCODE) " +
                "VALUES(1,'Telefon',100,'Prod_56154')," +
                "(2,'Telewizor',299,'Prod_12658')," +
                "(3,'Pralka',450,'Prod_45896')," +
                "(4,'Kalkulator',99,'Prod_36578')," +
                "(5,'Drukarka',150,'Prod_98756')," +
                "(6,'Komputer',800,'Prod_10654')," +
                "(7,'Monitor',340,'Prod_78412')");
    }


    @Override
    public Collection<Product> findAll() {
        return this.jdbcTemplate.query("SELECT * FROM PRODUCTS", new BeanPropertyRowMapper<Product>(Product.class));
    }

    @Override
    public ProductDto findProductByBarcode(String barcode) {
        List query = this.jdbcTemplate.query("SELECT * FROM PRODUCTS WHERE BARCODE = ?", new Object[]{barcode}, new ProductMapper());
        if (query.size() == 1) {
            return (ProductDto) query.get(0);
        } else {
            return null;
        }

    }


}

A to jest to co próbuje kombinować :

class ProductServiceImplTest extends Specification {

    @Shared
    JdbcTemplate jdbcTemplate

    @Shared
    ProductDao dao;

    @Shared
    ProductService productService;


    def setupSpec() {
        jdbcTemplate = Stub()
        dao = new ProductDaoImpl(jdbcTemplate)
        productService = new ProductServiceImpl(dao);

    }


    def "FindAll"() {
        when:
        dao.dropCreateTable()
        dao.insertInToTable()
        then: dao.findAll().size() != productService.findAll().size()
    }

    def "FindProductByBarcode"() {

    }
}
0

1)Nie masz co tu testować za bardzo
2)Twój kod to właśnie przykład jak nie powinien wyglądać @Service

0

ok rozumiem, że ten service jest na siłę ale bardziej mi chodzi o to jak w klasie testowej ściągnąć JdbcTemplate i mieć dostęp do tabeli ktora tworza metody w dao dropCreateTable i insertInToTable

0

i od razu jescze jedno pytanie odnośnie testów :) w jaki sposób testuje się w Spock @RestController a dokładnie coś takiego:

  @GetMapping(value = "all", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Collection<Product>> getAllAvailabeProducts() {
        Collection<Product> allProducts = service.findAll();
        HttpStatus httpStatus = allProducts != null ? HttpStatus.OK : HttpStatus.NOT_FOUND;
        return new ResponseEntity<>(allProducts, httpStatus);
    }

jest jakiś schemat na to

1

A co ty tu chcesz przetestować konkretnie w tym kontrolerze?
Po pierwsze fakt że masz tam nulla a nie Optional to już spory błąd, po drugie ja bym wydzielił sobie zupełnie osobną, moze statyczną, metodę do budowania tego twojego ResponseEntity, taką że przyjmuje Optional<T> i zwraca ResponseEntity ze statusem zależnym od tego czy optional był pusty czy nie. Przetestowanie takiej metody będzie proste.
I dzięki temu nagle w samym kontrolerze nie ma już niczego do testowania bo masz po prostu

return WhateverUtil.buildResponseEntity(service.findAll());

Bo cały błąd polega na tym, że pchasz jakąś logikę do kontrolera cały czas i stąd widzisz potrzebę testowania go... Z drugiej strony robisz serwis który w ogóle nie zawiera logiki tylko deleguje wywołanie do repozytorium. To jest jakaś masakra.

1 użytkowników online, w tym zalogowanych: 0, gości: 1