Генерация EAN13 для модульного тестирования в Java
У меня есть класс Article
это имеет поле ean
это комментируется с org.hibernate.validator.constraints.EAN
,
Как я могу сгенерировать действительные значения EAN13 для выполнения модульных тестов на кучу Article
s?
2 ответа
Ниже приведен пример проверки действительных / недействительных кодов EAN:
Следующий сайт использовался для получения действительного кода EAN 13: http://www.gomaro.ch/lecheck.htm
Может быть, вас также заинтересует API Barcode4j (например): http://barcode4j.sourceforge.net/
package ean;
import static org.junit.Assert.assertTrue;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import org.hibernate.validator.constraints.EAN;
import org.junit.Before;
import org.junit.Test;
/**
* Test EAN 13 constraint. EAN 13 = 12 digits + 1 check digit.
*
*/
public class testEAN13 {
private static Validator validator;
@BeforeClass
public static void setUp() {
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
validator = vf.getValidator();
}
@Test
public void validEAN() {
Article product = new Article("7894561330231");
Set<ConstraintViolation<Article>> violations = validator.validate(product);
assertTrue(violations.isEmpty());
}
@Test
public void invalidEAN() {
Article product = new Article("7894561330235");
Set<ConstraintViolation<Article>> violations = validator.validate(product);
assertTrue(violations.size() == 1);
}
class Article {
@EAN
private final String ean;
private Article(String ean) {
this.ean = ean;
}
}
}
Maven обязательные зависимости:
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.2.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
</dependencies>
Примечание. Для Hibernate Validator требуется зависимость от языка выражений.
Хорошо, я создал генератор EAN13 после некоторых исследований в Интернете
public class EANGenerator {
private static long _12_DIGITS = 100000000000L;
private EANGenerator() {
}
/**
* Generate the next EAN13 code
*
* @return
*/
public static String getEAN13() {
final String eanWithoutDigit = Long.toString(_12_DIGITS++);
assertThat(eanWithoutDigit, length(equalTo(12)));
int sum = 0;
for (int i = 0; i < eanWithoutDigit.length(); i++) {
sum = sum + (Integer.parseInt(String.valueOf(eanWithoutDigit.charAt(i))) * (i % 2 == 0 ? 1 : 3));
}
int checkDigit = sum % 10 == 0 ? 0 : (10-(sum % 10));
return eanWithoutDigit + checkDigit;
}
}
Достаточно вызвать статический метод из этого вспомогательного класса, чтобы получить следующий EAN13. Очевидно, что вызов этого значения очень и очень большое количество раз приведет к исключению, которое будет выброшено из-за количества проверяемых цифр (от 12 до 13).