Merge remote-tracking branch 'eugenp/master'
This commit is contained in:
commit
5ad9fae82c
|
@ -53,15 +53,27 @@
|
|||
<version>${junit.platform.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.openjdk.jmh</groupId>
|
||||
<artifactId>jmh-core</artifactId>
|
||||
<version>${openjdk.jmh.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.openjdk.jmh</groupId>
|
||||
<artifactId>jmh-generator-annprocess</artifactId>
|
||||
<version>${openjdk.jmh.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
<properties>
|
||||
<openjdk.jmh.version>1.19</openjdk.jmh.version>
|
||||
<junit.platform.version>1.2.0</junit.platform.version>
|
||||
<commons-lang3.version>3.5</commons-lang3.version>
|
||||
<commons-collections4.version>4.1</commons-collections4.version>
|
||||
<collections-generic.version>4.01</collections-generic.version>
|
||||
<avaitility.version>1.7.0</avaitility.version>
|
||||
<assertj.version>3.6.1</assertj.version>
|
||||
<eclipse.collections.version>9.2.0</eclipse.collections.version>
|
||||
<eclipse.collections.version>7.1.0</eclipse.collections.version>
|
||||
</properties>
|
||||
</project>
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
package com.baeldung.performance;
|
||||
|
||||
import org.openjdk.jmh.annotations.*;
|
||||
import org.openjdk.jmh.runner.Runner;
|
||||
import org.openjdk.jmh.runner.options.Options;
|
||||
import org.openjdk.jmh.runner.options.OptionsBuilder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@BenchmarkMode(Mode.AverageTime)
|
||||
@OutputTimeUnit(TimeUnit.NANOSECONDS)
|
||||
@Warmup(iterations = 5)
|
||||
public class CollectionsBenchmark {
|
||||
|
||||
@State(Scope.Thread)
|
||||
public static class MyState {
|
||||
private Set<Employee> employeeSet = new HashSet<>();
|
||||
private List<Employee> employeeList = new ArrayList<>();
|
||||
|
||||
private long iterations = 10000;
|
||||
|
||||
private Employee employee = new Employee(100L, "Harry");
|
||||
|
||||
@Setup(Level.Trial)
|
||||
public void setUp() {
|
||||
|
||||
for (long i = 0; i < iterations; i++) {
|
||||
employeeSet.add(new Employee(i, "John"));
|
||||
employeeList.add(new Employee(i, "John"));
|
||||
}
|
||||
|
||||
employeeList.add(employee);
|
||||
employeeSet.add(employee);
|
||||
}
|
||||
}
|
||||
|
||||
@Benchmark
|
||||
public boolean testArrayList(MyState state) {
|
||||
return state.employeeList.contains(state.employee);
|
||||
}
|
||||
|
||||
@Benchmark
|
||||
public boolean testHashSet(MyState state) {
|
||||
return state.employeeSet.contains(state.employee);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Options options = new OptionsBuilder()
|
||||
.include(CollectionsBenchmark.class.getSimpleName()).threads(1)
|
||||
.forks(1).shouldFailOnError(true)
|
||||
.shouldDoGC(true)
|
||||
.jvmArgs("-server").build();
|
||||
new Runner(options).run();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package com.baeldung.performance;
|
||||
|
||||
public class Employee {
|
||||
|
||||
private Long id;
|
||||
private String name;
|
||||
|
||||
public Employee(Long id, String name) {
|
||||
this.name = name;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Employee employee = (Employee) o;
|
||||
|
||||
if (!id.equals(employee.id)) return false;
|
||||
return name.equals(employee.name);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = id.hashCode();
|
||||
result = 31 * result + name.hashCode();
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
package com.baeldung.collection;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class StreamOperateAndRemoveUnitTest {
|
||||
|
||||
private List<Item> itemList;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
|
||||
itemList = new ArrayList<>();
|
||||
for (int i = 0; i < 10; i++) {
|
||||
itemList.add(new Item(i));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAListOf10Items_whenFilteredForQualifiedItems_thenFilteredListContains5Items() {
|
||||
|
||||
final List<Item> filteredList = itemList.stream().filter(item -> item.isQualified())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Assert.assertEquals(5, filteredList.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAListOf10Items_whenOperateAndRemoveQualifiedItemsUsingRemoveIf_thenListContains5Items() {
|
||||
|
||||
itemList.stream().filter(item -> item.isQualified()).forEach(item -> item.operate());
|
||||
itemList.removeIf(item -> item.isQualified());
|
||||
|
||||
Assert.assertEquals(5, itemList.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAListOf10Items_whenOperateAndRemoveQualifiedItemsUsingRemoveAll_thenListContains5Items() {
|
||||
|
||||
final List<Item> operatedList = new ArrayList<>();
|
||||
itemList.stream().filter(item -> item.isQualified()).forEach(item -> {
|
||||
item.operate();
|
||||
operatedList.add(item);
|
||||
});
|
||||
itemList.removeAll(operatedList);
|
||||
|
||||
Assert.assertEquals(5, itemList.size());
|
||||
}
|
||||
|
||||
class Item {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
|
||||
|
||||
private final int value;
|
||||
|
||||
public Item(final int value) {
|
||||
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public boolean isQualified() {
|
||||
|
||||
return value % 2 == 0;
|
||||
}
|
||||
|
||||
public void operate() {
|
||||
|
||||
logger.info("Even Number: " + this.value);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package com.baeldung.fileparser;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class BufferedReaderExample {
|
||||
|
||||
protected static ArrayList<String> generateArrayListFromFile(String filename) throws IOException {
|
||||
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
|
||||
try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
|
||||
|
||||
while (br.ready()) {
|
||||
result.add(br.readLine());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package com.baeldung.fileparser;
|
||||
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class FileReaderExample {
|
||||
|
||||
protected static ArrayList<String> generateArrayListFromFile(String filename) throws IOException {
|
||||
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
|
||||
try (FileReader f = new FileReader(filename)) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
while (f.ready()) {
|
||||
char c = (char) f.read();
|
||||
if (c == '\n') {
|
||||
result.add(sb.toString());
|
||||
sb = new StringBuffer();
|
||||
} else {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
if (sb.length() > 0) {
|
||||
result.add(sb.toString());
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package com.baeldung.fileparser;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class FilesReadLinesExample {
|
||||
|
||||
protected static ArrayList<String> generateArrayListFromFile(String filename) throws IOException {
|
||||
|
||||
List<String> result = Files.readAllLines(Paths.get(filename));
|
||||
|
||||
return (ArrayList<String>) result;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package com.baeldung.fileparser;
|
||||
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class ScannerIntExample {
|
||||
|
||||
protected static ArrayList<Integer> generateArrayListFromFile(String filename) throws IOException {
|
||||
|
||||
ArrayList<Integer> result = new ArrayList<>();
|
||||
|
||||
try (Scanner s = new Scanner(new FileReader(filename))) {
|
||||
|
||||
while (s.hasNext()) {
|
||||
result.add(s.nextInt());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package com.baeldung.fileparser;
|
||||
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class ScannerStringExample {
|
||||
|
||||
protected static ArrayList<String> generateArrayListFromFile(String filename) throws IOException {
|
||||
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
|
||||
try (Scanner s = new Scanner(new FileReader(filename))) {
|
||||
|
||||
while (s.hasNext()) {
|
||||
result.add(s.nextLine());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.baeldung.fileparser;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class BufferedReaderUnitTest {
|
||||
|
||||
protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
|
||||
|
||||
@Test
|
||||
public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
|
||||
List<String> lines = BufferedReaderExample.generateArrayListFromFile(TEXT_FILENAME);
|
||||
assertTrue("File does not has 2 lines", lines.size() == 2);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.baeldung.fileparser;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class FileReaderUnitTest {
|
||||
|
||||
protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
|
||||
|
||||
@Test
|
||||
public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
|
||||
List<String> lines = FileReaderExample.generateArrayListFromFile(TEXT_FILENAME);
|
||||
assertTrue("File does not has 2 lines", lines.size() == 2);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.baeldung.fileparser;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class FilesReadAllLinesUnitTest {
|
||||
|
||||
protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
|
||||
|
||||
@Test
|
||||
public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
|
||||
List<String> lines = FilesReadLinesExample.generateArrayListFromFile(TEXT_FILENAME);
|
||||
assertTrue("File does not has 2 lines", lines.size() == 2);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.baeldung.fileparser;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class ScannerIntUnitTest {
|
||||
|
||||
protected static final String NUMBER_FILENAME = "src/test/resources/sampleNumberFile.txt";
|
||||
|
||||
@Test
|
||||
public void whenParsingExistingTextFile_thenGetIntArrayList() throws IOException {
|
||||
List<Integer> numbers = ScannerIntExample.generateArrayListFromFile(NUMBER_FILENAME);
|
||||
assertTrue("File does not has 2 lines", numbers.size() == 2);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.baeldung.fileparser;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class ScannerStringUnitTest {
|
||||
|
||||
protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
|
||||
|
||||
@Test
|
||||
public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
|
||||
List<String> lines = ScannerStringExample.generateArrayListFromFile(TEXT_FILENAME);
|
||||
assertTrue("File does not has 2 lines", lines.size() == 2);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
111
|
||||
222
|
|
@ -0,0 +1,2 @@
|
|||
Hello
|
||||
World
|
|
@ -0,0 +1,23 @@
|
|||
package com.baeldung.binding;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Created by madhumita.g on 25-07-2018.
|
||||
*/
|
||||
public class Animal {
|
||||
|
||||
final static Logger logger = LoggerFactory.getLogger(Animal.class);
|
||||
|
||||
public void makeNoise() {
|
||||
logger.info("generic animal noise");
|
||||
}
|
||||
|
||||
public void makeNoise(Integer repetitions) {
|
||||
while(repetitions != 0) {
|
||||
logger.info("generic animal noise countdown " + repetitions);
|
||||
repetitions -= 1;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
package com.baeldung.binding;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Created by madhumita.g on 25-07-2018.
|
||||
*/
|
||||
public class AnimalActivity {
|
||||
|
||||
final static Logger logger = LoggerFactory.getLogger(AnimalActivity.class);
|
||||
|
||||
|
||||
public static void sleep(Animal animal) {
|
||||
logger.info("Animal is sleeping");
|
||||
}
|
||||
|
||||
public static void sleep(Cat cat) {
|
||||
logger.info("Cat is sleeping");
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Animal animal = new Animal();
|
||||
|
||||
//calling methods of animal object
|
||||
animal.makeNoise();
|
||||
|
||||
animal.makeNoise(3);
|
||||
|
||||
|
||||
//assigning a dog object to reference of type Animal
|
||||
Animal catAnimal = new Cat();
|
||||
|
||||
catAnimal.makeNoise();
|
||||
|
||||
// calling static function
|
||||
AnimalActivity.sleep(catAnimal);
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package com.baeldung.binding;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Created by madhumita.g on 25-07-2018.
|
||||
*/
|
||||
public class Cat extends Animal {
|
||||
|
||||
final static Logger logger = LoggerFactory.getLogger(Cat.class);
|
||||
|
||||
public void makeNoise() {
|
||||
|
||||
logger.info("meow");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package com.baeldung.keywords.finalize;
|
||||
|
||||
public class FinalizeObject {
|
||||
|
||||
@Override
|
||||
protected void finalize() throws Throwable {
|
||||
System.out.println("Execute finalize method");
|
||||
super.finalize();
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
FinalizeObject object = new FinalizeObject();
|
||||
object = null;
|
||||
System.gc();
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package com.baeldung.keywords.finalkeyword;
|
||||
|
||||
public final class Child extends Parent {
|
||||
|
||||
@Override
|
||||
void method1(int arg1, final int arg2) {
|
||||
// OK
|
||||
}
|
||||
|
||||
/* @Override
|
||||
void method2() {
|
||||
// Compilation error
|
||||
}*/
|
||||
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package com.baeldung.keywords.finalkeyword;
|
||||
|
||||
/*public class GrandChild extends Child {
|
||||
// Compilation error
|
||||
}*/
|
|
@ -0,0 +1,23 @@
|
|||
package com.baeldung.keywords.finalkeyword;
|
||||
|
||||
public class Parent {
|
||||
|
||||
int field1 = 1;
|
||||
final int field2 = 2;
|
||||
|
||||
Parent() {
|
||||
field1 = 2; // OK
|
||||
// field2 = 3; // Compilation error
|
||||
}
|
||||
|
||||
void method1(int arg1, final int arg2) {
|
||||
arg1 = 2; // OK
|
||||
// arg2 = 3; // Compilation error
|
||||
}
|
||||
|
||||
final void method2() {
|
||||
final int localVar = 2; // OK
|
||||
// localVar = 3; // Compilation error
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package com.baeldung.keywords.finallykeyword;
|
||||
|
||||
public class FinallyExample {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
try {
|
||||
System.out.println("Execute try block");
|
||||
throw new Exception();
|
||||
} catch (Exception e) {
|
||||
System.out.println("Execute catch block");
|
||||
} finally {
|
||||
System.out.println("Execute finally block");
|
||||
}
|
||||
|
||||
try {
|
||||
System.out.println("Execute try block");
|
||||
} finally {
|
||||
System.out.println("Execute finally block");
|
||||
}
|
||||
|
||||
try {
|
||||
System.out.println("Execute try block");
|
||||
throw new Exception();
|
||||
} finally {
|
||||
System.out.println("Execute finally block");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package com.baeldung.regexp.datepattern.optmization;
|
||||
|
||||
public class OptimizedMatcher {
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,95 @@
|
|||
package com.baeldung.binding;
|
||||
|
||||
import ch.qos.logback.classic.Level;
|
||||
import ch.qos.logback.classic.Logger;
|
||||
import ch.qos.logback.classic.spi.LoggingEvent;
|
||||
import ch.qos.logback.core.Appender;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
*https://gist.github.com/bloodredsun/a041de13e57bf3c6c040
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
|
||||
public class AnimalActivityUnitTest {
|
||||
|
||||
@Mock
|
||||
private Appender mockAppender;
|
||||
@Captor
|
||||
private ArgumentCaptor<LoggingEvent> captorLoggingEvent;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||
logger.addAppender(mockAppender);
|
||||
}
|
||||
|
||||
@After
|
||||
public void teardown() {
|
||||
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||
logger.detachAppender(mockAppender);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAnimalReference__whenRefersAnimalObject_shouldCallFunctionWithAnimalParam() {
|
||||
|
||||
Animal animal = new Animal();
|
||||
|
||||
AnimalActivity.sleep(animal);
|
||||
|
||||
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||
|
||||
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||
|
||||
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||
|
||||
assertThat(loggingEvent.getFormattedMessage(),
|
||||
is("Animal is sleeping"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenDogReference__whenRefersCatObject_shouldCallFunctionWithAnimalParam() {
|
||||
|
||||
Cat cat = new Cat();
|
||||
|
||||
AnimalActivity.sleep(cat);
|
||||
|
||||
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||
|
||||
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||
|
||||
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||
|
||||
assertThat(loggingEvent.getFormattedMessage(),
|
||||
is("Cat is sleeping"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAnimaReference__whenRefersDogObject_shouldCallFunctionWithAnimalParam() {
|
||||
|
||||
Animal cat = new Cat();
|
||||
|
||||
AnimalActivity.sleep(cat);
|
||||
|
||||
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||
|
||||
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||
|
||||
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||
|
||||
assertThat(loggingEvent.getFormattedMessage(),
|
||||
is("Animal is sleeping"));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
package com.baeldung.binding;
|
||||
|
||||
import ch.qos.logback.classic.Level;
|
||||
import ch.qos.logback.classic.Logger;
|
||||
import ch.qos.logback.classic.spi.LoggingEvent;
|
||||
import ch.qos.logback.core.Appender;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* Created by madhumita.g on 01-08-2018.
|
||||
*/
|
||||
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class AnimalUnitTest {
|
||||
@Mock
|
||||
private Appender mockAppender;
|
||||
@Captor
|
||||
private ArgumentCaptor<LoggingEvent> captorLoggingEvent;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||
logger.addAppender(mockAppender);
|
||||
}
|
||||
|
||||
@After
|
||||
public void teardown() {
|
||||
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||
logger.detachAppender(mockAppender);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenCalledWithoutParameters_shouldCallFunctionMakeNoiseWithoutParameters() {
|
||||
|
||||
Animal animal = new Animal();
|
||||
|
||||
animal.makeNoise();
|
||||
|
||||
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||
|
||||
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||
|
||||
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||
|
||||
assertThat(loggingEvent.getFormattedMessage(),
|
||||
is("generic animal noise"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenCalledWithParameters_shouldCallFunctionMakeNoiseWithParameters() {
|
||||
|
||||
Animal animal = new Animal();
|
||||
|
||||
int testValue = 3;
|
||||
animal.makeNoise(testValue);
|
||||
|
||||
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||
|
||||
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||
|
||||
while (testValue != 0) {
|
||||
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||
|
||||
assertThat(loggingEvent.getFormattedMessage(),
|
||||
is("generic animal noise countdown 3\n"
|
||||
+ "generic animal noise countdown 2\n"
|
||||
+ "generic animal noise countdown 1\n"));
|
||||
|
||||
testValue-=1;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
package com.baeldung.binding;
|
||||
|
||||
import ch.qos.logback.classic.Level;
|
||||
import ch.qos.logback.classic.Logger;
|
||||
import ch.qos.logback.classic.spi.LoggingEvent;
|
||||
import ch.qos.logback.core.Appender;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* Created by madhumita.g on 01-08-2018.
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class CatUnitTest {
|
||||
|
||||
@Mock
|
||||
private Appender mockAppender;
|
||||
|
||||
@Captor
|
||||
private ArgumentCaptor<LoggingEvent> captorLoggingEvent;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||
logger.addAppender(mockAppender);
|
||||
}
|
||||
|
||||
@After
|
||||
public void teardown() {
|
||||
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||
logger.detachAppender(mockAppender);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void makeNoiseTest() {
|
||||
|
||||
Cat cat = new Cat();
|
||||
|
||||
cat.makeNoise();
|
||||
|
||||
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||
|
||||
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||
|
||||
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||
|
||||
assertThat(loggingEvent.getFormattedMessage(),
|
||||
is("meow"));
|
||||
|
||||
}
|
||||
}
|
|
@ -9,28 +9,15 @@ import java.util.stream.Stream;
|
|||
import lombok.extern.java.Log;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
|
||||
@Log
|
||||
public class ListInitializationUnitTest {
|
||||
|
||||
@Rule
|
||||
public ExpectedException exception = ExpectedException.none();
|
||||
|
||||
@Test
|
||||
public void givenAnonymousInnerClass_thenInitialiseList() {
|
||||
List<String> cities = new ArrayList() {
|
||||
// Inside declaration of the subclass
|
||||
|
||||
// You can have multiple initializer block
|
||||
{
|
||||
log.info("Inside the first initializer block.");
|
||||
}
|
||||
|
||||
{
|
||||
log.info("Inside the second initializer block.");
|
||||
add("New York");
|
||||
add("Rio");
|
||||
add("Tokyo");
|
||||
|
@ -47,11 +34,10 @@ public class ListInitializationUnitTest {
|
|||
Assert.assertTrue(list.contains("foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Test(expected = UnsupportedOperationException.class)
|
||||
public void givenArraysAsList_whenAdd_thenUnsupportedException() {
|
||||
List<String> list = Arrays.asList("foo", "bar");
|
||||
|
||||
exception.expect(UnsupportedOperationException.class);
|
||||
list.add("baz");
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,109 @@
|
|||
package com.baeldung.regexp.optmization;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class OptimizedMatcherUnitTest {
|
||||
|
||||
private long time;
|
||||
private long mstimePreCompiled;
|
||||
private long mstimeNotPreCompiled;
|
||||
|
||||
private String action;
|
||||
|
||||
private List<String> items;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
Random random = new Random();
|
||||
items = new ArrayList<String>();
|
||||
long average = 0;
|
||||
|
||||
for (int i = 0; i < 100000; ++i) {
|
||||
StringBuilder s = new StringBuilder();
|
||||
int characters = random.nextInt(7) + 1;
|
||||
for (int k = 0; k < characters; ++ k) {
|
||||
char c = (char)(random.nextInt('Z' - 'A') + 'A');
|
||||
int rep = random.nextInt(95) + 5;
|
||||
for (int j = 0; j < rep; ++ j)
|
||||
s.append(c);
|
||||
average += rep;
|
||||
}
|
||||
items.add(s.toString());
|
||||
}
|
||||
|
||||
average /= 100000;
|
||||
System.out.println("generated data, average length: " + average);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void givenANotPreCompiledAndAPreCompiledPatternA_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
|
||||
|
||||
testPatterns("A*");
|
||||
assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenANotPreCompiledAndAPreCompiledPatternABC_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
|
||||
|
||||
testPatterns("A*B*C*");
|
||||
assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenANotPreCompiledAndAPreCompiledPatternECWF_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
|
||||
|
||||
testPatterns("E*C*W*F*");
|
||||
assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
|
||||
}
|
||||
|
||||
private void testPatterns(String regex) {
|
||||
time = System.nanoTime();
|
||||
int matched = 0;
|
||||
int unmatched = 0;
|
||||
|
||||
for (String item : this.items) {
|
||||
if (item.matches(regex)) {
|
||||
++matched;
|
||||
}
|
||||
else {
|
||||
++unmatched;
|
||||
}
|
||||
}
|
||||
|
||||
this.action = "uncompiled: regex=" + regex + " matched=" + matched + " unmatched=" + unmatched;
|
||||
|
||||
this.mstimeNotPreCompiled = (System.nanoTime() - time) / 1000000;
|
||||
System.out.println(this.action + ": " + mstimeNotPreCompiled + "ms");
|
||||
|
||||
time = System.nanoTime();
|
||||
|
||||
Matcher matcher = Pattern.compile(regex).matcher("");
|
||||
matched = 0;
|
||||
unmatched = 0;
|
||||
|
||||
for (String item : this.items) {
|
||||
if (matcher.reset(item).matches()) {
|
||||
++matched;
|
||||
}
|
||||
else {
|
||||
++unmatched;
|
||||
}
|
||||
}
|
||||
|
||||
this.action = "compiled: regex=" + regex + " matched=" + matched + " unmatched=" + unmatched;
|
||||
|
||||
this.mstimePreCompiled = (System.nanoTime() - time) / 1000000;
|
||||
System.out.println(this.action + ": " + mstimePreCompiled + "ms");
|
||||
}
|
||||
}
|
|
@ -224,10 +224,10 @@
|
|||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<kotlin-maven-plugin.version>1.2.51</kotlin-maven-plugin.version>
|
||||
<kotlin-test-junit.version>1.2.51</kotlin-test-junit.version>
|
||||
<kotlin-stdlib.version>1.2.51</kotlin-stdlib.version>
|
||||
<kotlin-reflect.version>1.2.51</kotlin-reflect.version>
|
||||
<kotlin-maven-plugin.version>1.2.60</kotlin-maven-plugin.version>
|
||||
<kotlin-test-junit.version>1.2.60</kotlin-test-junit.version>
|
||||
<kotlin-stdlib.version>1.2.60</kotlin-stdlib.version>
|
||||
<kotlin-reflect.version>1.2.60</kotlin-reflect.version>
|
||||
<kotlinx.version>0.22.5</kotlinx.version>
|
||||
<ktor.io.version>0.9.2</ktor.io.version>
|
||||
<mockito-kotlin.version>1.5.0</mockito-kotlin.version>
|
||||
|
@ -235,7 +235,7 @@
|
|||
<klaxon.version>3.0.4</klaxon.version>
|
||||
<khttp.version>0.1.0</khttp.version>
|
||||
<commons-math3.version>3.6.1</commons-math3.version>
|
||||
<junit.platform.version>1.0.0</junit.platform.version>
|
||||
<junit.platform.version>1.1.1</junit.platform.version>
|
||||
<junit.vintage.version>5.2.0</junit.vintage.version>
|
||||
<assertj.version>3.10.0</assertj.version>
|
||||
</properties>
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
package com.baeldung.nested
|
||||
|
||||
import org.slf4j.Logger
|
||||
import org.slf4j.LoggerFactory
|
||||
|
||||
class Computer(val model: String) {
|
||||
|
||||
companion object {
|
||||
const val originCountry = "China"
|
||||
fun getBuiltDate(): String {
|
||||
return "2018-05-23"
|
||||
}
|
||||
|
||||
val log: Logger = LoggerFactory.getLogger(Computer::class.java)
|
||||
}
|
||||
|
||||
//Nested class
|
||||
class MotherBoard(val manufacturer: String) {
|
||||
fun getInfo() = "Made by $manufacturer installed in $originCountry - ${getBuiltDate()}"
|
||||
}
|
||||
|
||||
//Inner class
|
||||
inner class HardDisk(val sizeInGb: Int) {
|
||||
fun getInfo() = "Installed on ${this@Computer} with $sizeInGb GB"
|
||||
}
|
||||
|
||||
interface Switcher {
|
||||
fun on(): String
|
||||
}
|
||||
|
||||
interface Protector {
|
||||
fun smart()
|
||||
}
|
||||
|
||||
fun powerOn(): String {
|
||||
//Local class
|
||||
var defaultColor = "Blue"
|
||||
|
||||
class Led(val color: String) {
|
||||
fun blink(): String {
|
||||
return "blinking $color"
|
||||
}
|
||||
|
||||
fun changeDefaultPowerOnColor() {
|
||||
defaultColor = "Violet"
|
||||
}
|
||||
}
|
||||
|
||||
val powerLed = Led("Green")
|
||||
log.debug("defaultColor is $defaultColor")
|
||||
powerLed.changeDefaultPowerOnColor()
|
||||
log.debug("defaultColor changed inside Led class to $defaultColor")
|
||||
//Anonymous object
|
||||
val powerSwitch = object : Switcher, Protector {
|
||||
override fun on(): String {
|
||||
return powerLed.blink()
|
||||
}
|
||||
|
||||
override fun smart() {
|
||||
log.debug("Smart protection is implemented")
|
||||
}
|
||||
|
||||
fun changeDefaultPowerOnColor() {
|
||||
defaultColor = "Yellow"
|
||||
}
|
||||
}
|
||||
powerSwitch.changeDefaultPowerOnColor()
|
||||
log.debug("defaultColor changed inside powerSwitch anonymous object to $defaultColor")
|
||||
return powerSwitch.on()
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "Computer(model=$model)"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package com.baeldung.nested
|
||||
|
||||
import org.assertj.core.api.Assertions.assertThat
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
class ComputerUnitTest {
|
||||
|
||||
@Test
|
||||
fun givenComputer_whenPowerOn_thenBlink() {
|
||||
val computer = Computer("Desktop")
|
||||
|
||||
assertThat(computer.powerOn()).isEqualTo("blinking Green")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenMotherboard_whenGetInfo_thenGetInstalledAndBuiltDetails() {
|
||||
val motherBoard = Computer.MotherBoard("MotherBoard Inc.")
|
||||
|
||||
assertThat(motherBoard.getInfo()).isEqualTo("Made by MotherBoard Inc. installed in China - 2018-05-23")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenHardDisk_whenGetInfo_thenGetComputerModelAndDiskSizeInGb() {
|
||||
val hardDisk = Computer("Desktop").HardDisk(1000)
|
||||
|
||||
assertThat(hardDisk.getInfo()).isEqualTo("Installed on Computer(model=Desktop) with 1000 GB")
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package org.baeldung.guava;
|
||||
|
||||
import static org.hamcrest.core.IsEqual.equalTo;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.Map;
|
||||
import org.junit.Test;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
public class GuavaMapInitializeUnitTest {
|
||||
|
||||
@Test
|
||||
public void givenKeyValuesShoudInitializeMap() {
|
||||
Map<String, String> articles = ImmutableMap.of("Title", "My New Article", "Title2", "Second Article");
|
||||
|
||||
assertThat(articles.get("Title"), equalTo("My New Article"));
|
||||
assertThat(articles.get("Title2"), equalTo("Second Article"));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void givenKeyValuesShouldCreateMutableMap() {
|
||||
Map<String, String> articles = Maps.newHashMap(ImmutableMap.of("Title", "My New Article", "Title2", "Second Article"));
|
||||
|
||||
assertThat(articles.get("Title"), equalTo("My New Article"));
|
||||
assertThat(articles.get("Title2"), equalTo("Second Article"));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package com.baeldung.hibernate.lifecycle;
|
||||
|
||||
import org.hibernate.EmptyInterceptor;
|
||||
import org.hibernate.type.Type;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class DirtyDataInspector extends EmptyInterceptor {
|
||||
private static final ArrayList<FootballPlayer> dirtyEntities = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
|
||||
dirtyEntities.add((FootballPlayer) entity);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static List<FootballPlayer> getDirtyEntities() {
|
||||
return dirtyEntities;
|
||||
}
|
||||
|
||||
public static void clearDirtyEntitites() {
|
||||
dirtyEntities.clear();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package com.baeldung.hibernate.lifecycle;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
||||
@Entity
|
||||
@Table(name = "Football_Player")
|
||||
public class FootballPlayer {
|
||||
@Id
|
||||
@GeneratedValue
|
||||
private long id;
|
||||
|
||||
@Column
|
||||
private String name;
|
||||
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "FootballPlayer{" + "id=" + id + ", name='" + name + '\'' + '}';
|
||||
}
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
package com.baeldung.hibernate.lifecycle;
|
||||
|
||||
import org.h2.tools.RunScript;
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.hibernate.Transaction;
|
||||
import org.hibernate.boot.Metadata;
|
||||
import org.hibernate.boot.MetadataSources;
|
||||
import org.hibernate.boot.SessionFactoryBuilder;
|
||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||
import org.hibernate.engine.spi.EntityEntry;
|
||||
import org.hibernate.engine.spi.SessionImplementor;
|
||||
import org.hibernate.service.ServiceRegistry;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URL;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.ResultSet;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class HibernateLifecycleUtil {
|
||||
private static SessionFactory sessionFactory;
|
||||
private static Connection connection;
|
||||
|
||||
public static void init() throws Exception {
|
||||
Properties hbConfigProp = getHibernateProperties();
|
||||
Class.forName(hbConfigProp.getProperty("hibernate.connection.driver_class"));
|
||||
connection = DriverManager.getConnection(hbConfigProp.getProperty("hibernate.connection.url"), hbConfigProp.getProperty("hibernate.connection.username"), hbConfigProp.getProperty("hibernate.connection.password"));
|
||||
|
||||
try (InputStream h2InitStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("lifecycle-init.sql");
|
||||
InputStreamReader h2InitReader = new InputStreamReader(h2InitStream)) {
|
||||
RunScript.execute(connection, h2InitReader);
|
||||
}
|
||||
|
||||
ServiceRegistry serviceRegistry = configureServiceRegistry();
|
||||
sessionFactory = getSessionFactoryBuilder(serviceRegistry).applyInterceptor(new DirtyDataInspector()).build();
|
||||
}
|
||||
|
||||
public static void tearDown() throws Exception {
|
||||
sessionFactory.close();
|
||||
connection.close();
|
||||
}
|
||||
|
||||
public static SessionFactory getSessionFactory() {
|
||||
return sessionFactory;
|
||||
}
|
||||
|
||||
private static SessionFactoryBuilder getSessionFactoryBuilder(ServiceRegistry serviceRegistry) {
|
||||
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
|
||||
metadataSources.addAnnotatedClass(FootballPlayer.class);
|
||||
|
||||
Metadata metadata = metadataSources.buildMetadata();
|
||||
return metadata.getSessionFactoryBuilder();
|
||||
|
||||
}
|
||||
|
||||
private static ServiceRegistry configureServiceRegistry() throws IOException {
|
||||
Properties properties = getHibernateProperties();
|
||||
return new StandardServiceRegistryBuilder().applySettings(properties).build();
|
||||
}
|
||||
|
||||
private static Properties getHibernateProperties() throws IOException {
|
||||
Properties properties = new Properties();
|
||||
URL propertiesURL = Thread.currentThread().getContextClassLoader().getResource("hibernate-lifecycle.properties");
|
||||
try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) {
|
||||
properties.load(inputStream);
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
public static List<EntityEntry> getManagedEntities(Session session) {
|
||||
Map.Entry<Object, EntityEntry>[] entries = ((SessionImplementor) session).getPersistenceContext().reentrantSafeEntityEntries();
|
||||
return Arrays.stream(entries).map(e -> e.getValue()).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static Transaction startTransaction(Session s) {
|
||||
Transaction tx = s.getTransaction();
|
||||
tx.begin();
|
||||
return tx;
|
||||
}
|
||||
|
||||
public static int queryCount(String query) throws Exception {
|
||||
try (ResultSet rs = connection.createStatement().executeQuery(query)) {
|
||||
rs.next();
|
||||
return rs.getInt(1);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -58,5 +58,4 @@ public class HibernateInterceptorUnitTest {
|
|||
transaction.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,164 @@
|
|||
package com.baeldung.hibernate.lifecycle;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.hibernate.Transaction;
|
||||
import org.hibernate.engine.spi.Status;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static com.baeldung.hibernate.lifecycle.DirtyDataInspector.getDirtyEntities;
|
||||
import static com.baeldung.hibernate.lifecycle.HibernateLifecycleUtil.*;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class HibernateLifecycleUnitTest {
|
||||
|
||||
@BeforeClass
|
||||
public static void setup() throws Exception {
|
||||
HibernateLifecycleUtil.init();
|
||||
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void tearDown() throws Exception {
|
||||
HibernateLifecycleUtil.tearDown();
|
||||
}
|
||||
|
||||
@Before
|
||||
public void beforeMethod() {
|
||||
DirtyDataInspector.clearDirtyEntitites();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenEntityLoaded_thenEntityManaged() throws Exception {
|
||||
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||
try (Session session = sessionFactory.openSession()) {
|
||||
Transaction transaction = startTransaction(session);
|
||||
|
||||
assertThat(getManagedEntities(session)).isEmpty();
|
||||
|
||||
List<FootballPlayer> players = session.createQuery("from FootballPlayer").getResultList();
|
||||
assertThat(getManagedEntities(session)).size().isEqualTo(3);
|
||||
|
||||
assertThat(getDirtyEntities()).isEmpty();
|
||||
|
||||
FootballPlayer gigiBuffon = players.stream().filter(p -> p.getId() == 3).findFirst().get();
|
||||
|
||||
gigiBuffon.setName("Gianluigi Buffon");
|
||||
transaction.commit();
|
||||
|
||||
assertThat(getDirtyEntities()).size().isEqualTo(1);
|
||||
assertThat(getDirtyEntities().get(0).getId()).isEqualTo(3);
|
||||
assertThat(getDirtyEntities().get(0).getName()).isEqualTo("Gianluigi Buffon");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenDetached_thenNotTracked() throws Exception {
|
||||
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||
try (Session session = sessionFactory.openSession()) {
|
||||
Transaction transaction = startTransaction(session);
|
||||
|
||||
FootballPlayer cr7 = session.get(FootballPlayer.class, 1L);
|
||||
assertThat(getManagedEntities(session)).size().isEqualTo(1);
|
||||
assertThat(getManagedEntities(session).get(0).getId()).isEqualTo(cr7.getId());
|
||||
|
||||
session.evict(cr7);
|
||||
assertThat(getManagedEntities(session)).size().isEqualTo(0);
|
||||
|
||||
cr7.setName("CR7");
|
||||
transaction.commit();
|
||||
|
||||
assertThat(getDirtyEntities()).isEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenReattached_thenTrackedAgain() throws Exception {
|
||||
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||
try (Session session = sessionFactory.openSession()) {
|
||||
Transaction transaction = startTransaction(session);
|
||||
|
||||
FootballPlayer messi = session.get(FootballPlayer.class, 2L);
|
||||
|
||||
session.evict(messi);
|
||||
messi.setName("Leo Messi");
|
||||
transaction.commit();
|
||||
assertThat(getDirtyEntities()).isEmpty();
|
||||
|
||||
transaction = startTransaction(session);
|
||||
session.update(messi);
|
||||
transaction.commit();
|
||||
assertThat(getDirtyEntities()).size().isEqualTo(1);
|
||||
assertThat(getDirtyEntities().get(0).getName()).isEqualTo("Leo Messi");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNewEntityWithID_whenReattached_thenManaged() throws Exception {
|
||||
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||
try (Session session = sessionFactory.openSession()) {
|
||||
Transaction transaction = startTransaction(session);
|
||||
|
||||
FootballPlayer gigi = new FootballPlayer();
|
||||
gigi.setId(3);
|
||||
gigi.setName("Gigi the Legend");
|
||||
|
||||
session.update(gigi);
|
||||
assertThat(getManagedEntities(session)).size().isEqualTo(1);
|
||||
|
||||
transaction.commit();
|
||||
assertThat(getDirtyEntities()).size().isEqualTo(1);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenTransientEntity_whenSave_thenManaged() throws Exception {
|
||||
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||
try (Session session = sessionFactory.openSession()) {
|
||||
Transaction transaction = startTransaction(session);
|
||||
|
||||
FootballPlayer neymar = new FootballPlayer();
|
||||
neymar.setName("Neymar");
|
||||
|
||||
session.save(neymar);
|
||||
assertThat(getManagedEntities(session)).size().isEqualTo(1);
|
||||
assertThat(neymar.getId()).isNotNull();
|
||||
|
||||
int count = queryCount("select count(*) from Football_Player where name='Neymar'");
|
||||
assertThat(count).isEqualTo(0);
|
||||
|
||||
transaction.commit();
|
||||
|
||||
count = queryCount("select count(*) from Football_Player where name='Neymar'");
|
||||
assertThat(count).isEqualTo(1);
|
||||
|
||||
transaction = startTransaction(session);
|
||||
session.delete(neymar);
|
||||
transaction.commit();
|
||||
}
|
||||
}
|
||||
|
||||
@Test()
|
||||
public void whenDelete_thenMarkDeleted() throws Exception {
|
||||
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||
try (Session session = sessionFactory.openSession()) {
|
||||
Transaction transaction = startTransaction(session);
|
||||
|
||||
FootballPlayer neymar = new FootballPlayer();
|
||||
neymar.setName("Neymar");
|
||||
|
||||
session.save(neymar);
|
||||
transaction.commit();
|
||||
|
||||
transaction = startTransaction(session);
|
||||
session.delete(neymar);
|
||||
assertThat(getManagedEntities(session).get(0).getStatus()).isEqualTo(Status.DELETED);
|
||||
transaction.commit();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
hibernate.connection.driver_class=org.h2.Driver
|
||||
hibernate.connection.url=jdbc:h2:mem:lifecycledb;DB_CLOSE_DELAY=-1;
|
||||
hibernate.connection.username=sa
|
||||
hibernate.connection.password=
|
||||
hibernate.connection.autocommit=true
|
||||
|
||||
hibernate.dialect=org.hibernate.dialect.H2Dialect
|
||||
hibernate.show_sql=true
|
||||
hibernate.hbm2ddl.auto=validate
|
|
@ -0,0 +1,25 @@
|
|||
create sequence hibernate_sequence start with 1 increment by 1;
|
||||
|
||||
create table Football_Player (
|
||||
id bigint not null,
|
||||
name varchar(255),
|
||||
primary key (id)
|
||||
);
|
||||
|
||||
insert into
|
||||
Football_Player
|
||||
(name, id)
|
||||
values
|
||||
('Cristiano Ronaldo', next value for hibernate_sequence);
|
||||
|
||||
insert into
|
||||
Football_Player
|
||||
(name, id)
|
||||
values
|
||||
('Lionel Messi', next value for hibernate_sequence);
|
||||
|
||||
insert into
|
||||
Football_Player
|
||||
(name, id)
|
||||
values
|
||||
('Gigi Buffon', next value for hibernate_sequence);
|
14
json/pom.xml
14
json/pom.xml
|
@ -33,6 +33,20 @@
|
|||
<artifactId>json</artifactId>
|
||||
<version>20171018</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- https://search.maven.org/search?q=g:org.glassfish%20AND%20a:javax.json&core=gav -->
|
||||
<dependency>
|
||||
<groupId>org.glassfish</groupId>
|
||||
<artifactId>javax.json</artifactId>
|
||||
<version>1.1.2</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
package com.baeldung.jsonpointer;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import javax.json.Json;
|
||||
import javax.json.JsonObject;
|
||||
import javax.json.JsonPointer;
|
||||
import javax.json.JsonReader;
|
||||
import javax.json.JsonString;
|
||||
import javax.json.JsonStructure;
|
||||
|
||||
public class JsonPointerCrud {
|
||||
|
||||
private JsonStructure jsonStructure = null;
|
||||
|
||||
public JsonPointerCrud(String fileName) throws IOException {
|
||||
|
||||
try (JsonReader reader = Json.createReader(Files.newBufferedReader(Paths.get(fileName)))) {
|
||||
jsonStructure = reader.read();
|
||||
} catch (FileNotFoundException e) {
|
||||
System.out.println("Error to open json file: " + e.getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public JsonPointerCrud(InputStream stream) {
|
||||
|
||||
JsonReader reader = Json.createReader(stream);
|
||||
jsonStructure = reader.read();
|
||||
reader.close();
|
||||
|
||||
}
|
||||
|
||||
public JsonStructure insert(String key, String value) {
|
||||
|
||||
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||
JsonString jsonValue = Json.createValue(value);
|
||||
jsonStructure = jsonPointer.add(jsonStructure, jsonValue);
|
||||
|
||||
return jsonStructure;
|
||||
|
||||
}
|
||||
|
||||
public JsonStructure update(String key, String newValue) {
|
||||
|
||||
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||
JsonString jsonNewValue = Json.createValue(newValue);
|
||||
jsonStructure = jsonPointer.replace(jsonStructure, jsonNewValue);
|
||||
|
||||
return jsonStructure;
|
||||
}
|
||||
|
||||
public JsonStructure delete(String key) {
|
||||
|
||||
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||
jsonPointer.getValue(jsonStructure);
|
||||
jsonStructure = jsonPointer.remove(jsonStructure);
|
||||
|
||||
return jsonStructure;
|
||||
|
||||
}
|
||||
|
||||
public String fetchValueFromKey(String key) {
|
||||
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||
JsonString jsonString = (JsonString) jsonPointer.getValue(jsonStructure);
|
||||
|
||||
return jsonString.getString();
|
||||
}
|
||||
|
||||
public String fetchListValues(String key) {
|
||||
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||
JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
|
||||
|
||||
return jsonObject.toString();
|
||||
}
|
||||
|
||||
public String fetchFullJSON() {
|
||||
JsonPointer jsonPointer = Json.createPointer("");
|
||||
JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
|
||||
|
||||
return jsonObject.toString();
|
||||
|
||||
}
|
||||
|
||||
public boolean check(String key) {
|
||||
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||
boolean found = jsonPointer.containsValue(jsonStructure);
|
||||
|
||||
return found;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
package com.baeldung.jsonpointer;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class JsonPointerCrudUnitTest {
|
||||
|
||||
@Test
|
||||
public void testJsonPointerCrudForAddress() {
|
||||
|
||||
JsonPointerCrud jsonPointerCrud = new JsonPointerCrud(JsonPointerCrudUnitTest.class.getResourceAsStream("/address.json"));
|
||||
|
||||
assertFalse(jsonPointerCrud.check("city"));
|
||||
|
||||
// insert a value
|
||||
jsonPointerCrud.insert("city", "Rio de Janeiro");
|
||||
|
||||
assertTrue(jsonPointerCrud.check("city"));
|
||||
|
||||
// fetch full json
|
||||
String fullJSON = jsonPointerCrud.fetchFullJSON();
|
||||
|
||||
assertTrue(fullJSON.contains("name"));
|
||||
|
||||
assertTrue(fullJSON.contains("city"));
|
||||
|
||||
// fetch value
|
||||
String cityName = jsonPointerCrud.fetchValueFromKey("city");
|
||||
|
||||
assertEquals(cityName, "Rio de Janeiro");
|
||||
|
||||
// update value
|
||||
jsonPointerCrud.update("city", "Sao Paulo");
|
||||
|
||||
// fetch value
|
||||
cityName = jsonPointerCrud.fetchValueFromKey("city");
|
||||
|
||||
assertEquals(cityName, "Sao Paulo");
|
||||
|
||||
// delete
|
||||
jsonPointerCrud.delete("city");
|
||||
|
||||
assertFalse(jsonPointerCrud.check("city"));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testJsonPointerCrudForBooks() {
|
||||
|
||||
JsonPointerCrud jsonPointerCrud = new JsonPointerCrud(JsonPointerCrudUnitTest.class.getResourceAsStream("/books.json"));
|
||||
|
||||
// fetch value
|
||||
String book = jsonPointerCrud.fetchListValues("books/1");
|
||||
|
||||
assertEquals(book, "{\"title\":\"Title 2\",\"author\":\"John Doe\"}");
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"name": "Customer 01",
|
||||
"street name": "Street 01"
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"library": "My Personal Library",
|
||||
"books": [
|
||||
{ "title":"Title 1", "author":"Jane Doe" },
|
||||
{ "title":"Title 2", "author":"John Doe" }
|
||||
]
|
||||
}
|
|
@ -94,6 +94,24 @@
|
|||
</filesets>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<version>${maven.build.helper.version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>generate-sources</phase>
|
||||
<goals>
|
||||
<goal>add-source</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<sources>
|
||||
<source>src/main/another-src</source>
|
||||
</sources>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
@ -102,6 +120,7 @@
|
|||
<maven.failsafe.version>2.21.0</maven.failsafe.version>
|
||||
<maven.verifier.version>1.1</maven.verifier.version>
|
||||
<maven.clean.version>3.0.0</maven.clean.version>
|
||||
<maven.build.helper.version>3.0.0</maven.build.helper.version>
|
||||
<resources.name>Baeldung</resources.name>
|
||||
</properties>
|
||||
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
package com.baeldung.maven.plugins;
|
||||
|
||||
public class Foo {
|
||||
|
||||
public static String foo() {
|
||||
return "foo";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package com.baeldung.maven.plugins;
|
||||
|
||||
public class MultipleSrcFolders {
|
||||
|
||||
public static void callFoo() {
|
||||
Foo.foo();
|
||||
}
|
||||
|
||||
}
|
|
@ -31,6 +31,7 @@
|
|||
<module>spring-cloud-zuul-eureka-integration</module>
|
||||
<module>spring-cloud-contract</module>
|
||||
<module>spring-cloud-kubernetes</module>
|
||||
<module>spring-cloud-archaius</module>
|
||||
</modules>
|
||||
|
||||
<build>
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
# Spring Cloud Archaius
|
||||
|
||||
#### Basic Config
|
||||
This service has the basic, out-of-the-box Spring Cloud Netflix Archaius configuration.
|
||||
|
||||
#### Extra Configs
|
||||
This service customizes some properties supported by Archaius.
|
||||
|
||||
These properties are set up on the main method, since Archaius uses System properties, but they could be added as command line arguments when launching the app.
|
||||
|
||||
#### Additional Sources
|
||||
In this service we create a new AbstractConfiguration bean, setting up a new Configuration Properties source.
|
||||
|
||||
These properties have precedence over all the other properties in the Archaius Composite Configuration.
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>additional-sources-simple</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>additional-sources-simple</name>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung.spring.cloud</groupId>
|
||||
<artifactId>spring-cloud-archaius</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<relativePath>..</relativePath>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
|
@ -0,0 +1,13 @@
|
|||
package com.baeldung.spring.cloud.archaius.additionalsources;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class AdditionalSourcesSimpleApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(AdditionalSourcesSimpleApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package com.baeldung.spring.cloud.archaius.additionalsources.config;
|
||||
|
||||
import org.apache.commons.configuration.AbstractConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import com.netflix.config.DynamicConfiguration;
|
||||
import com.netflix.config.FixedDelayPollingScheduler;
|
||||
import com.netflix.config.PolledConfigurationSource;
|
||||
import com.netflix.config.sources.URLConfigurationSource;
|
||||
|
||||
@Configuration
|
||||
public class ApplicationPropertiesConfigurations {
|
||||
|
||||
@Bean
|
||||
public AbstractConfiguration addApplicationPropertiesSource() {
|
||||
PolledConfigurationSource source = new URLConfigurationSource("classpath:other-config.properties");
|
||||
return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.baeldung.spring.cloud.archaius.additionalsources.controller;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import com.netflix.config.DynamicPropertyFactory;
|
||||
import com.netflix.config.DynamicStringProperty;
|
||||
|
||||
@RestController
|
||||
public class ConfigPropertiesController {
|
||||
|
||||
private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.one", "not found!");
|
||||
|
||||
private DynamicStringProperty propertyTwoWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.two", "not found!");
|
||||
|
||||
private DynamicStringProperty propertyThreeWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.three", "not found!");
|
||||
|
||||
private DynamicStringProperty propertyFourWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.four", "not found!");
|
||||
|
||||
@GetMapping("/properties-from-dynamic")
|
||||
public Map<String, String> getPropertiesFromDynamic() {
|
||||
Map<String, String> properties = new HashMap<>();
|
||||
properties.put(propertyOneWithDynamic.getName(), propertyOneWithDynamic.get());
|
||||
properties.put(propertyTwoWithDynamic.getName(), propertyTwoWithDynamic.get());
|
||||
properties.put(propertyThreeWithDynamic.getName(), propertyThreeWithDynamic.get());
|
||||
properties.put(propertyFourWithDynamic.getName(), propertyFourWithDynamic.get());
|
||||
return properties;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
server.port=8082
|
||||
baeldung.archaius.properties.one=one FROM:application.properties
|
||||
baeldung.archaius.properties.two=two FROM:application.properties
|
|
@ -0,0 +1,2 @@
|
|||
baeldung.archaius.properties.one=one FROM:config.properties
|
||||
baeldung.archaius.properties.three=three FROM:config.properties
|
|
@ -0,0 +1,2 @@
|
|||
baeldung.archaius.properties.one=one FROM:other-config.properties
|
||||
baeldung.archaius.properties.four=four FROM:other-config.properties
|
|
@ -0,0 +1,54 @@
|
|||
package com.baeldung.spring.cloud.archaius.additionalsources;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.core.ParameterizedTypeReference;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
public class ArchaiusAdditionalSourcesLiveTest {
|
||||
|
||||
private static final String BASE_URL = "http://localhost:8082";
|
||||
|
||||
private static final String DYNAMIC_PROPERTIES_URL = "/properties-from-dynamic";
|
||||
private static final Map<String, String> EXPECTED_ARCHAIUS_PROPERTIES = createExpectedArchaiusProperties();
|
||||
|
||||
private static Map<String, String> createExpectedArchaiusProperties() {
|
||||
Map<String, String> map = new HashMap<>();
|
||||
map.put("baeldung.archaius.properties.one", "one FROM:other-config.properties");
|
||||
map.put("baeldung.archaius.properties.two", "two FROM:application.properties");
|
||||
map.put("baeldung.archaius.properties.three", "three FROM:config.properties");
|
||||
map.put("baeldung.archaius.properties.four", "four FROM:other-config.properties");
|
||||
return map;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
ConfigurableApplicationContext context;
|
||||
|
||||
@Autowired
|
||||
private TestRestTemplate template;
|
||||
|
||||
private <T> Map<T, T> exchangeAsMap(String uri, ParameterizedTypeReference<Map<T, T>> responseType) {
|
||||
return template.exchange(uri, HttpMethod.GET, null, responseType)
|
||||
.getBody();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNonDefaultConfigurationFilesSetup_whenRequestProperties_thenEndpointRetrievesValuesInFiles() {
|
||||
Map<String, String> initialResponse = this.exchangeAsMap(BASE_URL + DYNAMIC_PROPERTIES_URL, new ParameterizedTypeReference<Map<String, String>>() {
|
||||
});
|
||||
|
||||
assertThat(initialResponse).containsAllEntriesOf(EXPECTED_ARCHAIUS_PROPERTIES);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>basic-config</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>basic-config</name>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung.spring.cloud</groupId>
|
||||
<artifactId>spring-cloud-archaius</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<relativePath>..</relativePath>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
|
@ -0,0 +1,13 @@
|
|||
package com.baeldung.spring.cloud.archaius.basic;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class BasicArchaiusApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(BasicArchaiusApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
package com.baeldung.spring.cloud.archaius.basic.controller;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import com.netflix.config.DynamicIntProperty;
|
||||
import com.netflix.config.DynamicPropertyFactory;
|
||||
import com.netflix.config.DynamicStringProperty;
|
||||
|
||||
@RestController
|
||||
public class ConfigPropertiesController {
|
||||
|
||||
@Value("${baeldung.archaius.properties.one:not found!}")
|
||||
private String propertyOneWithValue;
|
||||
|
||||
@Value("${baeldung.archaius.properties.two:not found!}")
|
||||
private String propertyTwoWithValue;
|
||||
|
||||
@Value("${baeldung.archaius.properties.three:not found!}")
|
||||
private String propertyThreeWithValue;
|
||||
|
||||
@Value("${baeldung.archaius.properties.four:not found!}")
|
||||
private String propertyFourWithValue;
|
||||
|
||||
private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.one", "not found!");
|
||||
|
||||
private DynamicStringProperty propertyTwoWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.two", "not found!");
|
||||
|
||||
private DynamicStringProperty propertyThreeWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.three", "not found!");
|
||||
|
||||
private DynamicStringProperty propertyFourWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.four", "not found!");
|
||||
|
||||
private DynamicIntProperty intPropertyWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getIntProperty("baeldung.archaius.properties.int", 0);
|
||||
|
||||
@GetMapping("/properties-from-value")
|
||||
public Map<String, String> getPropertiesFromValue() {
|
||||
Map<String, String> properties = new HashMap<>();
|
||||
properties.put("baeldung.archaius.properties.one", propertyOneWithValue);
|
||||
properties.put("baeldung.archaius.properties.two", propertyTwoWithValue);
|
||||
properties.put("baeldung.archaius.properties.three", propertyThreeWithValue);
|
||||
properties.put("baeldung.archaius.properties.four", propertyFourWithValue);
|
||||
return properties;
|
||||
}
|
||||
|
||||
@GetMapping("/properties-from-dynamic")
|
||||
public Map<String, String> getPropertiesFromDynamic() {
|
||||
Map<String, String> properties = new HashMap<>();
|
||||
properties.put(propertyOneWithDynamic.getName(), propertyOneWithDynamic.get());
|
||||
properties.put(propertyTwoWithDynamic.getName(), propertyTwoWithDynamic.get());
|
||||
properties.put(propertyThreeWithDynamic.getName(), propertyThreeWithDynamic.get());
|
||||
properties.put(propertyFourWithDynamic.getName(), propertyFourWithDynamic.get());
|
||||
return properties;
|
||||
}
|
||||
|
||||
@GetMapping("/int-property")
|
||||
public Map<String, Integer> getIntPropertyFromDynamic() {
|
||||
Map<String, Integer> properties = new HashMap<>();
|
||||
properties.put(intPropertyWithDynamic.getName(), intPropertyWithDynamic.get());
|
||||
return properties;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
server.port=8080
|
||||
baeldung.archaius.properties.one=one FROM:application.properties
|
||||
baeldung.archaius.properties.two=two FROM:application.properties
|
|
@ -0,0 +1,4 @@
|
|||
baeldung.archaius.properties.one=one FROM:config.properties
|
||||
baeldung.archaius.properties.three=three FROM:config.properties
|
||||
|
||||
baeldung.archaius.properties.int=1
|
|
@ -0,0 +1,2 @@
|
|||
baeldung.archaius.properties.one=one FROM:other.properties
|
||||
baeldung.archaius.properties.four=four FROM:other.properties
|
|
@ -0,0 +1,45 @@
|
|||
package com.baeldung.spring.cloud.archaius.basic;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.junit.platform.runner.JUnitPlatform;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.util.TestPropertyValues;
|
||||
import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||
|
||||
import com.netflix.config.DynamicPropertyFactory;
|
||||
import com.netflix.config.DynamicStringProperty;
|
||||
|
||||
@RunWith(JUnitPlatform.class)
|
||||
@ExtendWith(SpringExtension.class)
|
||||
@SpringBootTest
|
||||
public class ArchaiusBasicConfigurationIntegrationTest {
|
||||
|
||||
@Autowired
|
||||
ConfigurableApplicationContext context;
|
||||
|
||||
private DynamicStringProperty testPropertyWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.test.properties.one", "not found!");
|
||||
|
||||
@Test
|
||||
public void givenIntialPropertyValue_whenPropertyChanges_thenArchaiusRetrievesNewValue() {
|
||||
String initialValue = testPropertyWithDynamic.get();
|
||||
|
||||
TestPropertyValues.of("baeldung.archaius.test.properties.one=new-value")
|
||||
.applyTo(context);
|
||||
context.publishEvent(new EnvironmentChangeEvent(Collections.singleton("baeldung.archaius.test.properties.one")));
|
||||
String finalValue = testPropertyWithDynamic.get();
|
||||
|
||||
assertThat(initialValue).isEqualTo("test-one");
|
||||
assertThat(finalValue).isEqualTo("new-value");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
package com.baeldung.spring.cloud.archaius.basic;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.core.ParameterizedTypeReference;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
public class ArchaiusBasicConfigurationLiveTest {
|
||||
|
||||
private static final String BASE_URL = "http://localhost:8080";
|
||||
|
||||
private static final String DYNAMIC_PROPERTIES_URL = "/properties-from-dynamic";
|
||||
private static final Map<String, String> EXPECTED_ARCHAIUS_PROPERTIES = createExpectedArchaiusProperties();
|
||||
|
||||
private static Map<String, String> createExpectedArchaiusProperties() {
|
||||
Map<String, String> map = new HashMap<>();
|
||||
map.put("baeldung.archaius.properties.one", "one FROM:application.properties");
|
||||
map.put("baeldung.archaius.properties.two", "two FROM:application.properties");
|
||||
map.put("baeldung.archaius.properties.three", "three FROM:config.properties");
|
||||
map.put("baeldung.archaius.properties.four", "not found!");
|
||||
return map;
|
||||
}
|
||||
|
||||
private static final String VALUE_PROPERTIES_URL = "/properties-from-value";
|
||||
private static final Map<String, String> EXPECTED_VALUE_PROPERTIES = createExpectedValueProperties();
|
||||
|
||||
private static Map<String, String> createExpectedValueProperties() {
|
||||
Map<String, String> map = new HashMap<>();
|
||||
map.put("baeldung.archaius.properties.one", "one FROM:application.properties");
|
||||
map.put("baeldung.archaius.properties.two", "two FROM:application.properties");
|
||||
map.put("baeldung.archaius.properties.three", "not found!");
|
||||
map.put("baeldung.archaius.properties.four", "not found!");
|
||||
return map;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
ConfigurableApplicationContext context;
|
||||
|
||||
@Autowired
|
||||
private TestRestTemplate template;
|
||||
|
||||
private <T> Map<T, T> exchangeAsMap(String uri, ParameterizedTypeReference<Map<T, T>> responseType) {
|
||||
return template.exchange(uri, HttpMethod.GET, null, responseType)
|
||||
.getBody();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenDefaultConfigurationSetup_whenRequestProperties_thenEndpointRetrievesValuesInFiles() {
|
||||
Map<String, String> initialResponse = this.exchangeAsMap(BASE_URL + DYNAMIC_PROPERTIES_URL, new ParameterizedTypeReference<Map<String, String>>() {
|
||||
});
|
||||
|
||||
assertThat(initialResponse).containsAllEntriesOf(EXPECTED_ARCHAIUS_PROPERTIES);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNonDefaultConfigurationFilesSetup_whenRequestSpringVisibleProperties_thenEndpointDoesntRetrieveArchaiusProperties() {
|
||||
Map<String, String> initialResponse = this.exchangeAsMap(BASE_URL + VALUE_PROPERTIES_URL, new ParameterizedTypeReference<Map<String, String>>() {
|
||||
});
|
||||
|
||||
assertThat(initialResponse).containsAllEntriesOf(EXPECTED_VALUE_PROPERTIES);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
baeldung.archaius.test.properties.one=test-one
|
||||
baeldung.archaius.test.properties.two=test-two
|
||||
baeldung.archaius.test.properties.int=1
|
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>extra-configs</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>extra-configs</name>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung.spring.cloud</groupId>
|
||||
<artifactId>spring-cloud-archaius</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<relativePath>..</relativePath>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-netflix-archaius</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-netflix</artifactId>
|
||||
<version>${spring-cloud-dependencies.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
<properties>
|
||||
<spring-cloud-dependencies.version>2.0.1.RELEASE</spring-cloud-dependencies.version>
|
||||
</properties>
|
||||
</project>
|
|
@ -0,0 +1,16 @@
|
|||
package com.baeldung.spring.cloud.archaius.extraconfigs;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class ExtraConfigsApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
// System properties can be set as command line arguments too
|
||||
System.setProperty("archaius.configurationSource.additionalUrls", "classpath:other-config-dir/extra.properties");
|
||||
System.setProperty("archaius.configurationSource.defaultFileName", "other.properties");
|
||||
SpringApplication.run(ExtraConfigsApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
package com.baeldung.spring.cloud.archaius.extraconfigs.controllers;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import com.netflix.config.DynamicPropertyFactory;
|
||||
import com.netflix.config.DynamicStringProperty;
|
||||
|
||||
@RestController
|
||||
public class ConfigPropertiesController {
|
||||
|
||||
@Value("${baeldung.archaius.properties.one:not found!}")
|
||||
private String propertyOneWithValue;
|
||||
|
||||
@Value("${baeldung.archaius.properties.two:not found!}")
|
||||
private String propertyTwoWithValue;
|
||||
|
||||
@Value("${baeldung.archaius.properties.three:not found!}")
|
||||
private String propertyThreeWithValue;
|
||||
|
||||
@Value("${baeldung.archaius.properties.four:not found!}")
|
||||
private String propertyFourWithValue;
|
||||
|
||||
private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.one", "not found!");
|
||||
|
||||
private DynamicStringProperty propertyTwoWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.two", "not found!");
|
||||
|
||||
private DynamicStringProperty propertyThreeWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.three", "not found!");
|
||||
|
||||
private DynamicStringProperty propertyFourWithDynamic = DynamicPropertyFactory.getInstance()
|
||||
.getStringProperty("baeldung.archaius.properties.four", "not found!");
|
||||
|
||||
@GetMapping("/properties-from-value")
|
||||
public Map<String, String> getPropertiesFromValue() {
|
||||
Map<String, String> properties = new HashMap<>();
|
||||
properties.put("baeldung.archaius.properties.one", propertyOneWithValue);
|
||||
properties.put("baeldung.archaius.properties.two", propertyTwoWithValue);
|
||||
properties.put("baeldung.archaius.properties.three", propertyThreeWithValue);
|
||||
properties.put("baeldung.archaius.properties.four", propertyFourWithValue);
|
||||
return properties;
|
||||
}
|
||||
|
||||
@GetMapping("/properties-from-dynamic")
|
||||
public Map<String, String> getPropertiesFromDynamic() {
|
||||
Map<String, String> properties = new HashMap<>();
|
||||
properties.put("baeldung.archaius.properties.one", propertyOneWithDynamic.get());
|
||||
properties.put("baeldung.archaius.properties.two", propertyTwoWithDynamic.get());
|
||||
properties.put("baeldung.archaius.properties.three", propertyThreeWithDynamic.get());
|
||||
properties.put("baeldung.archaius.properties.four", propertyFourWithDynamic.get());
|
||||
return properties;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
server.port=8081
|
||||
baeldung.archaius.properties.one=one FROM:application.properties
|
||||
baeldung.archaius.properties.two=two FROM:application.properties
|
|
@ -0,0 +1,2 @@
|
|||
baeldung.archaius.properties.one=one FROM:extra.properties
|
||||
baeldung.archaius.properties.three=three FROM:extra.properties
|
|
@ -0,0 +1,2 @@
|
|||
baeldung.archaius.properties.one=one FROM:other.properties
|
||||
baeldung.archaius.properties.four=four FROM:other.properties
|
|
@ -0,0 +1,54 @@
|
|||
package com.baeldung.spring.cloud.archaius.extraconfigs;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.core.ParameterizedTypeReference;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
public class ArchaiusExtraConfigsLiveTest {
|
||||
|
||||
private static final String BASE_URL = "http://localhost:8081";
|
||||
|
||||
private static final String DYNAMIC_PROPERTIES_URL = "/properties-from-dynamic";
|
||||
private static final Map<String, String> EXPECTED_ARCHAIUS_PROPERTIES = createExpectedArchaiusProperties();
|
||||
|
||||
private static Map<String, String> createExpectedArchaiusProperties() {
|
||||
Map<String, String> map = new HashMap<>();
|
||||
map.put("baeldung.archaius.properties.one", "one FROM:application.properties");
|
||||
map.put("baeldung.archaius.properties.two", "two FROM:application.properties");
|
||||
map.put("baeldung.archaius.properties.three", "three FROM:extra.properties");
|
||||
map.put("baeldung.archaius.properties.four", "four FROM:other.properties");
|
||||
return map;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
ConfigurableApplicationContext context;
|
||||
|
||||
@Autowired
|
||||
private TestRestTemplate template;
|
||||
|
||||
private <T> Map<T, T> exchangeAsMap(String uri, ParameterizedTypeReference<Map<T, T>> responseType) {
|
||||
return template.exchange(uri, HttpMethod.GET, null, responseType)
|
||||
.getBody();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNonDefaultConfigurationFilesSetup_whenRequestProperties_thenEndpointRetrievesValuesInFiles() {
|
||||
Map<String, String> initialResponse = this.exchangeAsMap(BASE_URL + DYNAMIC_PROPERTIES_URL, new ParameterizedTypeReference<Map<String, String>>() {
|
||||
});
|
||||
|
||||
assertThat(initialResponse).containsAllEntriesOf(EXPECTED_ARCHAIUS_PROPERTIES);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.baeldung.spring.cloud</groupId>
|
||||
<artifactId>spring-cloud-archaius</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<name>spring-cloud-archaius</name>
|
||||
<description>Spring Cloud Archaius Pom parent</description>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung.spring.cloud</groupId>
|
||||
<artifactId>spring-cloud</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<relativePath>..</relativePath>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
<module>basic-config</module>
|
||||
<module>additional-sources-simple</module>
|
||||
<module>extra-configs</module>
|
||||
</modules>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-netflix-archaius</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-runner</artifactId>
|
||||
<version>${junit.platform.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-netflix</artifactId>
|
||||
<version>${spring-cloud-dependencies.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<properties>
|
||||
<spring-cloud-dependencies.version>2.0.1.RELEASE</spring-cloud-dependencies.version>
|
||||
<junit.platform.version>1.2.0</junit.platform.version>
|
||||
</properties>
|
||||
</project>
|
|
@ -1,29 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>java-faker</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.github.javafaker</groupId>
|
||||
<artifactId>javafaker</artifactId>
|
||||
<version>0.15</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/junit/junit -->
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
</project>
|
|
@ -1,115 +0,0 @@
|
|||
package com.baeldung;
|
||||
|
||||
import com.github.javafaker.Faker;
|
||||
import com.github.javafaker.service.FakeValuesService;
|
||||
import com.github.javafaker.service.FakerIDN;
|
||||
import com.github.javafaker.service.LocaleDoesNotExistException;
|
||||
import com.github.javafaker.service.RandomService;
|
||||
import javafx.scene.Parent;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.Random;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class JavaFakerTest {
|
||||
|
||||
private Faker faker;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
faker = new Faker();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenJavaFaker_whenAddressObjectCalled_checkValidAddressInfoGiven() throws Exception {
|
||||
|
||||
Faker faker = new Faker();
|
||||
|
||||
String streetName = faker.address().streetName();
|
||||
String number = faker.address().buildingNumber();
|
||||
String city = faker.address().city();
|
||||
String country = faker.address().country();
|
||||
|
||||
System.out.println(String.format("%s\n%s\n%s\n%s",
|
||||
number,
|
||||
streetName,
|
||||
city,
|
||||
country));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenJavaFakersWithSameSeed_whenNameCalled_CheckSameName() throws Exception {
|
||||
|
||||
Faker faker1 = new Faker(new Random(24));
|
||||
Faker faker2 = new Faker(new Random(24));
|
||||
|
||||
assertEquals(faker1.name().firstName(), faker2.name().firstName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenJavaFakersWithDifferentLocals_checkZipCodesMatchRegex() throws Exception {
|
||||
|
||||
Faker ukFaker = new Faker(new Locale("en-GB"));
|
||||
Faker usFaker = new Faker(new Locale("en-US"));
|
||||
|
||||
System.out.println(String.format("American zipcode: %s", usFaker.address().zipCode()));
|
||||
System.out.println(String.format("British postcode: %s", ukFaker.address().zipCode()));
|
||||
|
||||
Pattern ukPattern = Pattern.compile("([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))\\s?[0-9][A-Za-z]{2})");
|
||||
Matcher ukMatcher = ukPattern.matcher(ukFaker.address().zipCode());
|
||||
|
||||
assertTrue(ukMatcher.find());
|
||||
|
||||
Matcher usMatcher = Pattern.compile("^\\d{5}(?:[-\\s]\\d{4})?$").matcher(usFaker.address().zipCode());
|
||||
|
||||
assertTrue(usMatcher.find());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenJavaFakerService_testFakersCreated() throws Exception {
|
||||
|
||||
RandomService randomService = new RandomService();
|
||||
|
||||
System.out.println(randomService.nextBoolean());
|
||||
System.out.println(randomService.nextDouble());
|
||||
|
||||
Faker faker = new Faker(new Random(randomService.nextLong()));
|
||||
|
||||
System.out.println(faker.address().city());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFakeValuesService() throws Exception {
|
||||
|
||||
FakeValuesService fakeValuesService = new FakeValuesService(new Locale("en-GB"), new RandomService());
|
||||
|
||||
String email = fakeValuesService.bothify("????##@gmail.com");
|
||||
Matcher emailMatcher = Pattern.compile("\\w{4}\\d{2}@gmail.com").matcher(email);
|
||||
assertTrue(emailMatcher.find());
|
||||
|
||||
String alphaNumericString = fakeValuesService.regexify("[a-z1-9]{10}");
|
||||
Matcher alphaNumericMatcher = Pattern.compile("[a-z1-9]{10}").matcher(alphaNumericString);
|
||||
assertTrue(alphaNumericMatcher.find());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Test(expected = LocaleDoesNotExistException.class)
|
||||
public void givenWrongLocale_whenFakerIsInitialised_testLocaleDoesNotExistExceptionIsThrown() throws Exception {
|
||||
|
||||
Faker wrongLocaleFaker = new Faker(new Locale("en-seaWorld"));
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0"?>
|
||||
<project
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parallel-tests-junit</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>math-test-functions</artifactId>
|
||||
<name>math-test-functions</name>
|
||||
<url>http://maven.apache.org</url>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.22.0</version>
|
||||
<configuration>
|
||||
<parallel>all</parallel>
|
||||
<threadCount>10</threadCount>
|
||||
<threadCountSuites>2</threadCountSuites>
|
||||
<threadCountClasses>2</threadCountClasses>
|
||||
<threadCountMethods>6</threadCountMethods>
|
||||
<parallelTestTimeoutInSeconds>3.5</parallelTestTimeoutInSeconds>
|
||||
<parallelTestTimeoutForcedInSeconds>5</parallelTestTimeoutForcedInSeconds>
|
||||
<perCoreThreadCount>true</perCoreThreadCount>
|
||||
<includes>
|
||||
<include>FunctionTestSuite.class</include>
|
||||
</includes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
|
@ -4,12 +4,11 @@ import static org.junit.Assert.assertEquals;
|
|||
|
||||
import org.junit.Test;
|
||||
|
||||
public class MathFunctionTest {
|
||||
public class ArithmeticFunctionTest {
|
||||
|
||||
@Test
|
||||
public void test_addingIntegers_returnsSum() throws InterruptedException {
|
||||
public void test_addingIntegers_returnsSum() {
|
||||
assertEquals(22, Math.addExact(10, 12));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
|
@ -0,0 +1,19 @@
|
|||
package com.baeldung;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class ComparisonFunctionTest {
|
||||
|
||||
@Test
|
||||
public void test_findMax() {
|
||||
assertEquals(20, Math.max(10, 20));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test_findMin() {
|
||||
assertEquals(10, Math.min(10, 20));
|
||||
}
|
||||
|
||||
}
|
|
@ -5,7 +5,7 @@ import org.junit.runners.Suite;
|
|||
import org.junit.runners.Suite.SuiteClasses;
|
||||
|
||||
@RunWith(Suite.class)
|
||||
@SuiteClasses({StringFunctionTest.class, MathFunctionTest.class})
|
||||
@SuiteClasses({ ComparisonFunctionTest.class, ArithmeticFunctionTest.class })
|
||||
public class FunctionTestSuite {
|
||||
|
||||
}
|
|
@ -1,50 +1,12 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parallel-tests-junit</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>parallel-tests-junit</name>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.22.0</version>
|
||||
<configuration>
|
||||
<parallel>all</parallel>
|
||||
<threadCount>10</threadCount>
|
||||
<threadCountSuites>2</threadCountSuites>
|
||||
<threadCountClasses>2</threadCountClasses>
|
||||
<threadCountMethods>6</threadCountMethods>
|
||||
<parallelTestTimeoutInSeconds>3.5</parallelTestTimeoutInSeconds>
|
||||
<parallelTestTimeoutForcedInSeconds>5</parallelTestTimeoutForcedInSeconds>
|
||||
<perCoreThreadCount>true</perCoreThreadCount>
|
||||
<includes>
|
||||
<include>FunctionTestSuite.class</include>
|
||||
</includes>
|
||||
|
||||
</configuration>
|
||||
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<packaging>pom</packaging>
|
||||
<modules>
|
||||
<module>math-test-functions</module>
|
||||
<module>string-test-functions</module>
|
||||
</modules>
|
||||
</project>
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0"?>
|
||||
<project
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parallel-tests-junit</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>string-test-functions</artifactId>
|
||||
<name>string-test-functions</name>
|
||||
<url>http://maven.apache.org</url>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.22.0</version>
|
||||
<configuration>
|
||||
<parallel>all</parallel>
|
||||
<useUnlimitedThreads>true</useUnlimitedThreads>
|
||||
<threadCountMethods>2</threadCountMethods>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
|
@ -88,6 +88,11 @@
|
|||
<artifactId>javalite-common</artifactId>
|
||||
<version>${javalite.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.javafaker</groupId>
|
||||
<artifactId>javafaker</artifactId>
|
||||
<version>0.15</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
|
|
@ -0,0 +1,121 @@
|
|||
package com.baeldung.javafaker;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.Random;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.github.javafaker.Faker;
|
||||
import com.github.javafaker.service.FakeValuesService;
|
||||
import com.github.javafaker.service.LocaleDoesNotExistException;
|
||||
import com.github.javafaker.service.RandomService;
|
||||
|
||||
public class JavaFakerUnitTest {
|
||||
|
||||
private Faker faker;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
faker = new Faker();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenJavaFaker_whenAddressObjectCalled_checkValidAddressInfoGiven() throws Exception {
|
||||
|
||||
Faker faker = new Faker();
|
||||
|
||||
String streetName = faker.address()
|
||||
.streetName();
|
||||
String number = faker.address()
|
||||
.buildingNumber();
|
||||
String city = faker.address()
|
||||
.city();
|
||||
String country = faker.address()
|
||||
.country();
|
||||
|
||||
System.out.println(String.format("%s\n%s\n%s\n%s", number, streetName, city, country));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenJavaFakersWithSameSeed_whenNameCalled_CheckSameName() throws Exception {
|
||||
|
||||
Faker faker1 = new Faker(new Random(24));
|
||||
Faker faker2 = new Faker(new Random(24));
|
||||
|
||||
assertEquals(faker1.name()
|
||||
.firstName(),
|
||||
faker2.name()
|
||||
.firstName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenJavaFakersWithDifferentLocals_checkZipCodesMatchRegex() throws Exception {
|
||||
|
||||
Faker ukFaker = new Faker(new Locale("en-GB"));
|
||||
Faker usFaker = new Faker(new Locale("en-US"));
|
||||
|
||||
System.out.println(String.format("American zipcode: %s", usFaker.address()
|
||||
.zipCode()));
|
||||
System.out.println(String.format("British postcode: %s", ukFaker.address()
|
||||
.zipCode()));
|
||||
|
||||
Pattern ukPattern = Pattern.compile("([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))\\s?[0-9][A-Za-z]{2})");
|
||||
Matcher ukMatcher = ukPattern.matcher(ukFaker.address()
|
||||
.zipCode());
|
||||
|
||||
assertTrue(ukMatcher.find());
|
||||
|
||||
Matcher usMatcher = Pattern.compile("^\\d{5}(?:[-\\s]\\d{4})?$")
|
||||
.matcher(usFaker.address()
|
||||
.zipCode());
|
||||
|
||||
assertTrue(usMatcher.find());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenJavaFakerService_testFakersCreated() throws Exception {
|
||||
|
||||
RandomService randomService = new RandomService();
|
||||
|
||||
System.out.println(randomService.nextBoolean());
|
||||
System.out.println(randomService.nextDouble());
|
||||
|
||||
Faker faker = new Faker(new Random(randomService.nextLong()));
|
||||
|
||||
System.out.println(faker.address()
|
||||
.city());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFakeValuesService() throws Exception {
|
||||
|
||||
FakeValuesService fakeValuesService = new FakeValuesService(new Locale("en-GB"), new RandomService());
|
||||
|
||||
String email = fakeValuesService.bothify("????##@gmail.com");
|
||||
Matcher emailMatcher = Pattern.compile("\\w{4}\\d{2}@gmail.com")
|
||||
.matcher(email);
|
||||
assertTrue(emailMatcher.find());
|
||||
|
||||
String alphaNumericString = fakeValuesService.regexify("[a-z1-9]{10}");
|
||||
Matcher alphaNumericMatcher = Pattern.compile("[a-z1-9]{10}")
|
||||
.matcher(alphaNumericString);
|
||||
assertTrue(alphaNumericMatcher.find());
|
||||
|
||||
}
|
||||
|
||||
@Test(expected = LocaleDoesNotExistException.class)
|
||||
public void givenWrongLocale_whenFakerIsInitialised_testLocaleDoesNotExistExceptionIsThrown() throws Exception {
|
||||
|
||||
Faker wrongLocaleFaker = new Faker(new Locale("en-seaWorld"));
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue