Guava: Working with Collections II

本文深入探讨了Google Guava库的几个高级特性:Table数据结构的创建与视图获取、不可变集合的优势与使用方式、比较链与范围的结合应用以及Ordering类的灵活运用。通过具体实例展示了这些特性的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Table

2. ImmutableCollections

3. Comparision Chain & Range

4. Ordering

 

1. Table: Map<R, Map<C, V>>

    1> Create table

package edu.xmu.guava.collection;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

import com.google.common.collect.HashBasedTable;

public class TableTest {
    @Test
    public void createTest() {
	HashBasedTable<Integer, Integer, String> table = HashBasedTable
		.create();
	table.put(0, 0, "A");
	table.put(0, 1, "B");
	table.put(0, 2, "C");
	table.put(1, 0, "D");
	table.put(1, 1, "E");

	assertTrue(table.contains(0, 0));
	assertTrue(table.contains(1, 1));
	assertFalse(table.contains(1, 2));
	assertFalse(table.contains(2, 0));

	table = HashBasedTable.create(2, 2);
	table.put(0, 0, "A");
	table.put(0, 1, "B");
	table.put(0, 2, "C"); // Will auto expand to ensure capacity
	table.put(1, 0, "D");
	table.put(1, 1, "E");

	HashBasedTable<Integer, Integer, String> table2 = HashBasedTable
		.create(table);
	assertEquals(2, table2.rowMap().size()); // total 2 rows
	assertEquals(3, table2.row(0).size()); // total 3 cols in row 0
	assertEquals(3, table2.columnMap().size()); // total 3 cols
	assertEquals(1, table2.column(2).size()); // total 1 row in col 2

	table2.remove(0, 2);
	assertEquals(2, table2.rowMap().size()); // total 2 rows
	assertEquals(2, table2.row(0).size()); // total 3 cols in row 0
	assertEquals(2, table2.columnMap().size()); // total 2 cols
	assertEquals(2, table2.column(1).size()); // total 2 rows in col 1
    }
}

 This is the graph representation of the table created above.

    2> Table Views: The table provides some great methods for obtaining different views of the underlying data in the table.
Map<Integer, String> columnMap = table.column(columnNo);
Map<Integer, String> rowMap = table.row(rowNo);
package edu.xmu.guava.collection;

import static org.junit.Assert.assertEquals;

import java.util.Map;

import org.junit.Test;

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.ImmutableTable;
import com.google.common.collect.Table;

public class TableTest {
    @Test(expected = UnsupportedOperationException.class)
    public void tableViewTest() {
	Table<Integer, Integer, String> table = HashBasedTable.create();
	table.put(0, 0, "A");
	table.put(0, 1, "B");
	table.put(0, 2, "C");
	table.put(1, 0, "D");
	table.put(1, 1, "E");

	assertEquals("C", table.row(0).get(2));
	assertEquals("D", table.row(1).get(0));
	assertEquals("E", table.row(1).get(1));

	Map<Integer, String> rowMap = table.row(0);
	rowMap.put(3, "F"); // table is updated
	assertEquals("F", table.row(0).get(3));

	Map<Integer, String> colMap = table.column(2);
	colMap.put(3, "G"); // table is updated
	assertEquals("G", table.row(3).get(2));
	assertEquals("G", table.column(2).get(3));

	Table<Integer, Integer, String> immutableTable = ImmutableTable
		.<Integer, Integer, String> builder().putAll(table).build();
	rowMap = immutableTable.row(0);
	rowMap.put(4, "H"); // UnsupporttedOperationException will be thrown
    }
}

 

2. ImmutableCollections

    1) If we don't explicitly have a need for a mutable collection, we should always favor using an immutable one.

        First of all, immutable collections are completely thread-safe.

        Secondly, they offer protection from unknown users who may try to access your code.

    @Test
    public void test() {
	List<String> list = Lists.newArrayList("A", "B", "C", "D", "E");

	List<String> addedList = ImmutableList.<String> builder().addAll(list)
		.add("F").build();
	assertEquals(Lists.newArrayList("A", "B", "C", "D", "E", "F"),
		addedList);

	addedList = new ImmutableList.Builder<String>().addAll(list).add("G")
		.build();
	assertEquals(Lists.newArrayList("A", "B", "C", "D", "E", "G"),
		addedList);
    }

    We can see in source code that ImmutableXXX.<T>builder() == new ImmutableXXX.Builder<T>();

  public static <E> Builder<E> builder() {
    return new Builder<E>();
  }

    Builder pattern is used to create an ImmutableXXX instance

 

3. ComparisonChain & Range

    1) ComparisionChain:

        1> UML for ComparisionChain: Attention that they are using Chain of Responsibity design pattern here.


        2> Usage:

package edu.xmu.guava.collection;

import java.util.Set;

import org.apache.log4j.Logger;
import org.junit.Test;

import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

public class ComparisionChainTest {

    Logger logger = Logger.getLogger(ComparisionChainTest.class);

    @Test
    public void sortTest() {
	Set<Person> persons = Sets.newTreeSet(Lists.newArrayList(new Person(
		"Yang", 23), new Person("Yang", 20), new Person("Yang", 33),
		new Person("Li", 12), new Person("Zhang", 21)));

	logger.info(persons);
    }

    static class Person implements Comparable<Person> {
	private String name;
	private int age;

	public Person(String name, int age) {
	    super();
	    this.name = name;
	    this.age = age;
	}

	public int compareTo(Person o) {
	    return ComparisonChain.start().compare(this.name, o.name)
		    .compare(this.age, o.age).result();
	}

	@Override
	public String toString() {
	    return "Person [name=" + name + ", age=" + age + "]";
	}

    }
}

    2) Range:

           1> It is usually used with ComparisionChain and serve as/for Predicate

           2> Range object implements the Predicate interface

    @Test
    public void comparableTest() {
	Range<Person> personRange = Range.closed(new Person("A", 1),
		new Person("B", 21));
	
	assertTrue(personRange.contains(new Person("A", 2)));
	assertTrue(personRange.contains(new Person("A", 21)));
	assertTrue(personRange.contains(new Person("A", Integer.MAX_VALUE)));
	assertTrue(personRange.contains(new Person("B", 1)));
	assertTrue(personRange.contains(new Person("B", 21)));
	assertFalse(personRange.contains(new Person("B", 22)));
    }

    public static class Person implements Comparable<Person> {
	private String name;
	private int age;

	public Person(String name, int age) {
	    super();
	    this.name = name;
	    this.age = age;
	}

	@Override
	public String toString() {
	    return "Person [name=" + name + ", age=" + age + "]";
	}

	@Override
	public int compareTo(Person o) {
	    return ComparisonChain.start().compare(this.name, o.name)
		    .compare(this.age, o.age).result();
	}

    }
    @Test
    public void comparableTest2() {
	Range<Person> personRange1 = Range.closed(new Person("A", 1),
		new Person("C", 1));

	Range<Person> personRange2 = Range.closed(new Person("D", 1),
		new Person("F", 2));

	Predicate<Person> personPredicate = Predicates.or(personRange1,
		personRange2);
	assertTrue(personPredicate.apply(new Person("B", 1)));
	assertTrue(personPredicate.apply(new Person("C", 1)));
	assertTrue(personPredicate.apply(new Person("D", Integer.MAX_VALUE)));
	assertTrue(personPredicate.apply(new Person("E", 1)));
	assertTrue(personPredicate.apply(new Person("E", Integer.MAX_VALUE)));
	assertFalse(personPredicate.apply(new Person("F", 3)));
    }

 

4. Ordering:

package edu.xmu.guava.collections;

import static org.junit.Assert.assertEquals;

import java.util.Comparator;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;

public class OrderingTest {
    List<String> versionList;
    List<String> descSortedVersionList;

    @Before
    public void setUp() {
	versionList = Lists.newArrayList("11-0", "1-1", "2-1", "11-21",
		"11-111", "0-1");
	descSortedVersionList = Lists.newArrayList("11-111", "11-21", "11-0",
		"2-1", "1-1", "0-1");
    }

    @Test
    public void sortTest() {
	List<String> sortedVersionList = Ordering
		.from(new Comparator<String>() {
		    @Override
		    public int compare(String o1, String o2) {
			Function<String, Integer> parseIntFunc = new Function<String, Integer>() {
			    @Override
			    public Integer apply(String input) {
				return Integer.parseInt(input);
			    }
			};
			List<Integer> prevVersions = FluentIterable
				.from(Splitter.on('-').trimResults()
					.omitEmptyStrings().split(o1))
				.transform(parseIntFunc).toList();
			List<Integer> currVersions = FluentIterable
				.from(Splitter.on('-').trimResults()
					.omitEmptyStrings().split(o2))
				.transform(parseIntFunc).toList();
			return ComparisonChain
				.start()
				.compare(prevVersions.get(0),
					currVersions.get(0))
				.compare(prevVersions.get(1),
					currVersions.get(1)).result();
		    }
		}).reverse().sortedCopy(versionList);

	assertEquals(descSortedVersionList, sortedVersionList);
    }

    @Test
    public void sortTest2() {
	List<Person> personList = Lists.newArrayList(new Person("Yang", "Male",
		1), new Person("Li", "Female", 2), new Person("Zhang", "Male",
		24), new Person("Yang", "Female", 20));

	List<Person> sortedPersonList = Ordering.from(new Comparator<Person>() {
	    @Override
	    public int compare(Person o1, Person o2) {
		return o1.name.compareTo(o2.name);
	    }
	}).compound(new Comparator<Person>() {
	    @Override
	    public int compare(Person o1, Person o2) {
		return o1.age - o2.age;
	    }
	}).compound(new Comparator<Person>() {
	    @Override
	    public int compare(Person o1, Person o2) {
		return o1.gender.compareTo(o2.gender);
	    }
	}).sortedCopy(personList);
	System.out.println(sortedPersonList);
    }

    public class Person {
	private String name;
	private String gender;
	private int age;

	public Person(String name, String gender, int age) {
	    super();
	    this.name = name;
	    this.gender = gender;
	    this.age = age;
	}

	@Override
	public String toString() {
	    return "Person [name=" + name + ", gender=" + gender + ", age="
		    + age + "]";
	}

    }
}

    Comments: We can use Ordering without changing the Person (no need to implements Comparable).

 

Reference Links:

1) Getting Started with Google Guava -Bill Bejeck 

 

F:\zhang\jdk18\bin\java.exe "-javaagent:F:\zhang\IDEA\IntelliJ IDEA 2023.3.4\lib\idea_rt.jar=57121:F:\zhang\IDEA\IntelliJ IDEA 2023.3.4\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath F:\zhang\IDEA\IDEAprojects\Covid-2304\target\classes;C:\Users\user\.m2\repository\org\apache\hadoop\hadoop-common\3.2.2\hadoop-common-3.2.2.jar;C:\Users\user\.m2\repository\org\apache\hadoop\hadoop-annotations\3.2.2\hadoop-annotations-3.2.2.jar;C:\Users\user\.m2\repository\com\google\guava\guava\27.0-jre\guava-27.0-jre.jar;C:\Users\user\.m2\repository\com\google\guava\failureaccess\1.0\failureaccess-1.0.jar;C:\Users\user\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\user\.m2\repository\org\checkerframework\checker-qual\2.5.2\checker-qual-2.5.2.jar;C:\Users\user\.m2\repository\com\google\errorprone\error_prone_annotations\2.2.0\error_prone_annotations-2.2.0.jar;C:\Users\user\.m2\repository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;C:\Users\user\.m2\repository\org\codehaus\mojo\animal-sniffer-annotations\1.17\animal-sniffer-annotations-1.17.jar;C:\Users\user\.m2\repository\commons-cli\commons-cli\1.2\commons-cli-1.2.jar;C:\Users\user\.m2\repository\org\apache\commons\commons-math3\3.1.1\commons-math3-3.1.1.jar;C:\Users\user\.m2\repository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;C:\Users\user\.m2\repository\org\apache\httpcomponents\httpcore\4.4.13\httpcore-4.4.13.jar;C:\Users\user\.m2\repository\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;C:\Users\user\.m2\repository\commons-io\commons-io\2.5\commons-io-2.5.jar;C:\Users\user\.m2\repository\commons-net\commons-net\3.6\commons-net-3.6.jar;C:\Users\user\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\Users\user\.m2\repository\javax\servlet\javax.servlet-api\3.1.0\javax.ser
03-19
D:\software\Java\jdk1.8.0_451\bin\java.exe -Dvisualgc.id=3129413093850500 -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\lib\idea_rt.jar=14415:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\plugins\junit\lib\junit5-rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\plugins\junit\lib\junit-rt.jar;D:\software\Java\jdk1.8.0_451\jre\lib\charsets.jar;D:\software\Java\jdk1.8.0_451\jre\lib\deploy.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\access-bridge-64.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\cldrdata.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\dnsns.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\jaccess.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\localedata.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\nashorn.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\sunec.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\sunjce_provider.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\sunmscapi.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\sunpkcs11.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\zipfs.jar;D:\software\Java\jdk1.8.0_451\jre\lib\javaws.jar;D:\software\Java\jdk1.8.0_451\jre\lib\jce.jar;D:\software\Java\jdk1.8.0_451\jre\lib\jfr.jar;D:\software\Java\jdk1.8.0_451\jre\lib\jsse.jar;D:\software\Java\jdk1.8.0_451\jre\lib\management-agent.jar;D:\software\Java\jdk1.8.0_451\jre\lib\plugin.jar;D:\software\Java\jdk1.8.0_451\jre\lib\resources.jar;D:\software\Java\jdk1.8.0_451\jre\lib\rt.jar;D:\workspace\git_localrepo\access-control\person\person-core\target\test-classes;D:\workspace\git_localrepo\access-control\person\person-core\target\classes;D:\workspace\git_localrepo\access-control\person\person-api\target\classes;D:\workspace\git_localrepo\access-control\person\person-port-repository-api\target\classes;F:\Program Files\repository\org\springframework\data\spring-data-mongodb\3.4.7\spring-data-mongodb-3.4.7.jar;F:\Program Files\repository\org\springframework\spring-tx\5.3.25\spring-tx-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-context\5.3.25\spring-context-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-aop\5.3.25\spring-aop-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-beans\5.3.25\spring-beans-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-expression\5.3.25\spring-expression-5.3.25.jar;F:\Program Files\repository\org\springframework\data\spring-data-commons\2.7.7\spring-data-commons-2.7.7.jar;F:\Program Files\repository\org\mongodb\mongodb-driver-core\4.6.1\mongodb-driver-core-4.6.1.jar;F:\Program Files\repository\org\mongodb\bson\4.6.1\bson-4.6.1.jar;F:\Program Files\repository\org\mongodb\bson-record-codec\4.6.1\bson-record-codec-4.6.1.jar;F:\Program Files\repository\com\tplink\cdd\vigi-common-mongo\2.0.105-SNAPSHOT\vigi-common-mongo-2.0.105-SNAPSHOT.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-data-mongodb\2.7.8\spring-boot-starter-data-mongodb-2.7.8.jar;F:\Program Files\repository\org\mongodb\mongodb-driver-sync\4.6.1\mongodb-driver-sync-4.6.1.jar;F:\Program Files\repository\com\tplink\cdd\vigi-common\2.0.105-SNAPSHOT\vigi-common-2.0.105-SNAPSHOT.jar;F:\Program Files\repository\com\google\guava\guava\29.0-jre\guava-29.0-jre.jar;F:\Program Files\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;F:\Program Files\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;F:\Program Files\repository\org\checkerframework\checker-qual\2.11.1\checker-qual-2.11.1.jar;F:\Program Files\repository\com\google\errorprone\error_prone_annotations\2.3.4\error_prone_annotations-2.3.4.jar;F:\Program Files\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;F:\Program Files\repository\org\json\json\20230227\json-20230227.jar;F:\Program Files\repository\com\fasterxml\jackson\core\jackson-databind\2.13.4.2\jackson-databind-2.13.4.2.jar;F:\Program Files\repository\cn\hutool\hutool-core\5.8.15\hutool-core-5.8.15.jar;F:\Program Files\repository\cn\hutool\hutool-crypto\5.8.15\hutool-crypto-5.8.15.jar;F:\Program Files\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;F:\Program Files\repository\org\hibernate\validator\hibernate-validator\6.2.5.Final\hibernate-validator-6.2.5.Final.jar;F:\Program Files\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;F:\Program Files\repository\org\jboss\logging\jboss-logging\3.4.3.Final\jboss-logging-3.4.3.Final.jar;F:\Program Files\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;F:\Program Files\repository\org\springframework\boot\spring-boot\2.7.8\spring-boot-2.7.8.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-configuration-processor\2.7.8\spring-boot-configuration-processor-2.7.8.jar;F:\Program Files\repository\org\springframework\spring-web\5.3.25\spring-web-5.3.25.jar;F:\Program Files\repository\io\micrometer\micrometer-registry-prometheus\1.9.7\micrometer-registry-prometheus-1.9.7.jar;F:\Program Files\repository\io\prometheus\simpleclient_common\0.15.0\simpleclient_common-0.15.0.jar;F:\Program Files\repository\io\prometheus\simpleclient\0.15.0\simpleclient-0.15.0.jar;F:\Program Files\repository\io\prometheus\simpleclient_tracer_otel\0.15.0\simpleclient_tracer_otel-0.15.0.jar;F:\Program Files\repository\io\prometheus\simpleclient_tracer_common\0.15.0\simpleclient_tracer_common-0.15.0.jar;F:\Program Files\repository\io\prometheus\simpleclient_tracer_otel_agent\0.15.0\simpleclient_tracer_otel_agent-0.15.0.jar;F:\Program Files\repository\com\tplink\nbu\common\platform-cloud-sdk\2.1.60\platform-cloud-sdk-2.1.60.jar;F:\Program Files\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;F:\Program Files\repository\org\apache\httpcomponents\httpcore-nio\4.4.16\httpcore-nio-4.4.16.jar;F:\Program Files\repository\com\tplink\nbu\common\nbu-common-utils\2.1.60\nbu-common-utils-2.1.60.jar;F:\Program Files\repository\org\softee\pojo-mbean\1.1\pojo-mbean-1.1.jar;F:\Program Files\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;F:\Program Files\repository\com\tplink\nbu\common\pii\2.1.60\pii-2.1.60.jar;F:\Program Files\repository\com\jayway\jsonpath\json-path\2.7.0\json-path-2.7.0.jar;F:\Program Files\repository\net\minidev\json-smart\2.4.8\json-smart-2.4.8.jar;F:\Program Files\repository\net\minidev\accessors-smart\2.4.8\accessors-smart-2.4.8.jar;F:\Program Files\repository\org\ow2\asm\asm\9.1\asm-9.1.jar;F:\Program Files\repository\javax\servlet\javax.servlet-api\4.0.1\javax.servlet-api-4.0.1.jar;F:\Program Files\repository\io\netty\netty-all\4.1.87.Final\netty-all-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-buffer\4.1.87.Final\netty-buffer-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec\4.1.87.Final\netty-codec-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-dns\4.1.87.Final\netty-codec-dns-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-haproxy\4.1.87.Final\netty-codec-haproxy-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-http\4.1.87.Final\netty-codec-http-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-http2\4.1.87.Final\netty-codec-http2-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-memcache\4.1.87.Final\netty-codec-memcache-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-mqtt\4.1.87.Final\netty-codec-mqtt-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-redis\4.1.87.Final\netty-codec-redis-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-smtp\4.1.87.Final\netty-codec-smtp-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-socks\4.1.87.Final\netty-codec-socks-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-stomp\4.1.87.Final\netty-codec-stomp-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-xml\4.1.87.Final\netty-codec-xml-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-common\4.1.87.Final\netty-common-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-handler\4.1.87.Final\netty-handler-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-native-unix-common\4.1.87.Final\netty-transport-native-unix-common-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-handler-proxy\4.1.87.Final\netty-handler-proxy-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-handler-ssl-ocsp\4.1.87.Final\netty-handler-ssl-ocsp-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-resolver\4.1.87.Final\netty-resolver-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-resolver-dns\4.1.87.Final\netty-resolver-dns-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport\4.1.87.Final\netty-transport-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-rxtx\4.1.87.Final\netty-transport-rxtx-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-sctp\4.1.87.Final\netty-transport-sctp-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-udt\4.1.87.Final\netty-transport-udt-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-classes-epoll\4.1.87.Final\netty-transport-classes-epoll-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-classes-kqueue\4.1.87.Final\netty-transport-classes-kqueue-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-resolver-dns-classes-macos\4.1.87.Final\netty-resolver-dns-classes-macos-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-native-epoll\4.1.87.Final\netty-transport-native-epoll-4.1.87.Final-linux-x86_64.jar;F:\Program Files\repository\io\netty\netty-transport-native-epoll\4.1.87.Final\netty-transport-native-epoll-4.1.87.Final-linux-aarch_64.jar;F:\Program Files\repository\io\netty\netty-transport-native-kqueue\4.1.87.Final\netty-transport-native-kqueue-4.1.87.Final-osx-x86_64.jar;F:\Program Files\repository\io\netty\netty-transport-native-kqueue\4.1.87.Final\netty-transport-native-kqueue-4.1.87.Final-osx-aarch_64.jar;F:\Program Files\repository\io\netty\netty-resolver-dns-native-macos\4.1.87.Final\netty-resolver-dns-native-macos-4.1.87.Final-osx-x86_64.jar;F:\Program Files\repository\io\netty\netty-resolver-dns-native-macos\4.1.87.Final\netty-resolver-dns-native-macos-4.1.87.Final-osx-aarch_64.jar;F:\Program Files\repository\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;F:\Program Files\repository\net\sourceforge\javacsv\javacsv\2.0\javacsv-2.0.jar;F:\Program Files\repository\com\googlecode\java-ipv6\java-ipv6\0.17\java-ipv6-0.17.jar;F:\Program Files\repository\org\apache\poi\poi-ooxml\4.1.2\poi-ooxml-4.1.2.jar;F:\Program Files\repository\org\apache\poi\poi\4.1.2\poi-4.1.2.jar;F:\Program Files\repository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;F:\Program Files\repository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;F:\Program Files\repository\com\zaxxer\SparseBitSet\1.2\SparseBitSet-1.2.jar;F:\Program Files\repository\org\apache\poi\poi-ooxml-schemas\4.1.2\poi-ooxml-schemas-4.1.2.jar;F:\Program Files\repository\org\apache\xmlbeans\xmlbeans\3.1.0\xmlbeans-3.1.0.jar;F:\Program Files\repository\org\apache\commons\commons-compress\1.19\commons-compress-1.19.jar;F:\Program Files\repository\com\github\virtuald\curvesapi\1.06\curvesapi-1.06.jar;F:\Program Files\repository\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar;F:\Program Files\repository\org\bouncycastle\bcpkix-jdk15on\1.68\bcpkix-jdk15on-1.68.jar;F:\Program Files\repository\org\mapstruct\mapstruct\1.4.2.Final\mapstruct-1.4.2.Final.jar;F:\Program Files\repository\org\mapstruct\mapstruct-processor\1.4.2.Final\mapstruct-processor-1.4.2.Final.jar;F:\Program Files\repository\org\apache\skywalking\apm-toolkit-log4j-2.x\8.1.0\apm-toolkit-log4j-2.x-8.1.0.jar;F:\Program Files\repository\org\apache\skywalking\apm-toolkit-trace\8.1.0\apm-toolkit-trace-8.1.0.jar;F:\Program Files\repository\com\tplink\nbu\skywalking-sdk\1.0.0\skywalking-sdk-1.0.0.jar;F:\Program Files\repository\io\grpc\grpc-netty-shaded\1.27.1\grpc-netty-shaded-1.27.1.jar;F:\Program Files\repository\io\grpc\grpc-core\1.27.1\grpc-core-1.27.1.jar;F:\Program Files\repository\io\grpc\grpc-api\1.27.1\grpc-api-1.27.1.jar;F:\Program Files\repository\io\grpc\grpc-context\1.27.1\grpc-context-1.27.1.jar;F:\Program Files\repository\org\codehaus\mojo\animal-sniffer-annotations\1.18\animal-sniffer-annotations-1.18.jar;F:\Program Files\repository\com\google\code\gson\gson\2.9.1\gson-2.9.1.jar;F:\Program Files\repository\com\google\android\annotations\4.1.1.4\annotations-4.1.1.4.jar;F:\Program Files\repository\io\perfmark\perfmark-api\0.19.0\perfmark-api-0.19.0.jar;F:\Program Files\repository\org\apache\httpcomponents\httpclient\4.5.14\httpclient-4.5.14.jar;F:\Program Files\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter\2.7.8\spring-boot-starter-2.7.8.jar;F:\Program Files\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;F:\Program Files\repository\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-log4j2\2.7.8\spring-boot-starter-log4j2-2.7.8.jar;F:\Program Files\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;F:\Program Files\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;F:\Program Files\repository\org\apache\logging\log4j\log4j-slf4j-impl\2.17.2\log4j-slf4j-impl-2.17.2.jar;F:\Program Files\repository\org\apache\logging\log4j\log4j-core\2.17.2\log4j-core-2.17.2.jar;F:\Program Files\repository\org\apache\logging\log4j\log4j-jul\2.17.2\log4j-jul-2.17.2.jar;F:\Program Files\repository\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar;F:\Program Files\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;F:\Program Files\repository\com\tplink\cdd\vigi-common-eventbus\2.0.105-SNAPSHOT\vigi-common-eventbus-2.0.105-SNAPSHOT.jar;F:\Program Files\repository\com\tplink\smb\eventcenter.api\1.4.5\eventcenter.api-1.4.5.jar;F:\Program Files\repository\com\tplink\cdd\vigi-common-tpcloud\2.0.105-SNAPSHOT\vigi-common-tpcloud-2.0.105-SNAPSHOT.jar;F:\Program Files\repository\com\tplink\account-api-sdk\1.3.172\account-api-sdk-1.3.172.jar;F:\Program Files\repository\com\tplink\platform\common-grpc\1.0.4\common-grpc-1.0.4.jar;F:\Program Files\repository\com\google\protobuf\protobuf-java\3.19.2\protobuf-java-3.19.2.jar;F:\Program Files\repository\com\tplink\nbu\common\pii-mask-spring-boot-autoconfigure\2.1.51\pii-mask-spring-boot-autoconfigure-2.1.51.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-web\2.7.8\spring-boot-starter-web-2.7.8.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-json\2.7.8\spring-boot-starter-json-2.7.8.jar;F:\Program Files\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.4\jackson-datatype-jdk8-2.13.4.jar;F:\Program Files\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.4\jackson-module-parameter-names-2.13.4.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-tomcat\2.7.8\spring-boot-starter-tomcat-2.7.8.jar;F:\Program Files\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.71\tomcat-embed-websocket-9.0.71.jar;F:\Program Files\repository\org\springframework\spring-webmvc\5.3.25\spring-webmvc-5.3.25.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-validation\2.7.8\spring-boot-starter-validation-2.7.8.jar;F:\Program Files\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.71\tomcat-embed-el-9.0.71.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-actuator\2.7.8\spring-boot-starter-actuator-2.7.8.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.7.8\spring-boot-actuator-autoconfigure-2.7.8.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-actuator\2.7.8\spring-boot-actuator-2.7.8.jar;F:\Program Files\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.4\jackson-datatype-jsr310-2.13.4.jar;F:\Program Files\repository\com\hubspot\jackson\jackson-datatype-protobuf\0.9.15\jackson-datatype-protobuf-0.9.15.jar;F:\Program Files\repository\com\google\protobuf\protobuf-java-util\3.19.3\protobuf-java-util-3.19.3.jar;F:\Program Files\repository\com\google\code\findbugs\annotations\3.0.1\annotations-3.0.1.jar;F:\Program Files\repository\com\tplink\account-sdk\1.3.172\account-sdk-1.3.172.jar;F:\Program Files\repository\com\tplink\account\auth-sdk\1.1.621\auth-sdk-1.1.621.jar;F:\Program Files\repository\com\tplink\common\mail-sdk\1.1.507\mail-sdk-1.1.507.jar;F:\Program Files\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.71\tomcat-embed-core-9.0.71.jar;F:\Program Files\repository\org\apache\tomcat\tomcat-annotations-api\9.0.71\tomcat-annotations-api-9.0.71.jar;F:\Program Files\repository\com\tplink\cdd\common\components-email-cloud-platform\1.0.11\components-email-cloud-platform-1.0.11.jar;F:\Program Files\repository\com\tplink\cdd\common\components-email-api\1.0.11\components-email-api-1.0.11.jar;F:\Program Files\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;F:\Program Files\repository\com\tplink\cdd\common\components-email-common\1.0.11\components-email-common-1.0.11.jar;F:\Program Files\repository\com\tplink\smb\solution-components-lock-api\1.1.5\solution-components-lock-api-1.1.5.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-autoconfigure\2.7.8\spring-boot-autoconfigure-2.7.8.jar;F:\Program Files\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;F:\Program Files\repository\com\tplink\smb\solution-components-cache-api\1.4.3\solution-components-cache-api-1.4.3.jar;F:\Program Files\repository\com\tplink\smb\solution-components-cache-mem\1.4.3\solution-components-cache-mem-1.4.3.jar;F:\Program Files\repository\com\github\ben-manes\caffeine\caffeine\2.9.3\caffeine-2.9.3.jar;F:\Program Files\repository\com\tplink\smb\solution-component-storage-api\1.4.10\solution-component-storage-api-1.4.10.jar;F:\Program Files\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;F:\Program Files\repository\com\tplink\smb\solution-component-storage-port-s3\1.4.10\solution-component-storage-port-s3-1.4.10.jar;F:\Program Files\repository\com\amazonaws\aws-java-sdk-s3\1.12.415\aws-java-sdk-s3-1.12.415.jar;F:\Program Files\repository\com\amazonaws\aws-java-sdk-kms\1.12.415\aws-java-sdk-kms-1.12.415.jar;F:\Program Files\repository\com\amazonaws\aws-java-sdk-core\1.12.415\aws-java-sdk-core-1.12.415.jar;F:\Program Files\repository\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;F:\Program Files\repository\software\amazon\ion\ion-java\1.0.2\ion-java-1.0.2.jar;F:\Program Files\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-cbor\2.13.4\jackson-dataformat-cbor-2.13.4.jar;F:\Program Files\repository\joda-time\joda-time\2.8.1\joda-time-2.8.1.jar;F:\Program Files\repository\com\amazonaws\jmespath-java\1.12.415\jmespath-java-1.12.415.jar;F:\Program Files\repository\com\amazonaws\aws-java-sdk-sts\1.12.415\aws-java-sdk-sts-1.12.415.jar;F:\Program Files\repository\com\tplink\cdd\vigi-common-algorithm\2.0.105-SNAPSHOT\vigi-common-algorithm-2.0.105-SNAPSHOT.jar;F:\Program Files\repository\com\amazonaws\aws-java-sdk-lambda\1.11.923\aws-java-sdk-lambda-1.11.923.jar;F:\Program Files\repository\com\tplink\smb\eventcenter.kafka\1.4.5\eventcenter.kafka-1.4.5.jar;F:\Program Files\repository\com\tplink\smb\eventcenter.core\1.4.5\eventcenter.core-1.4.5.jar;F:\Program Files\repository\org\springframework\kafka\spring-kafka\2.8.11\spring-kafka-2.8.11.jar;F:\Program Files\repository\org\springframework\spring-messaging\5.3.25\spring-messaging-5.3.25.jar;F:\Program Files\repository\org\springframework\retry\spring-retry\1.3.4\spring-retry-1.3.4.jar;F:\Program Files\repository\org\apache\kafka\kafka-clients\3.1.2\kafka-clients-3.1.2.jar;F:\Program Files\repository\com\github\luben\zstd-jni\1.5.0-4\zstd-jni-1.5.0-4.jar;F:\Program Files\repository\org\lz4\lz4-java\1.8.0\lz4-java-1.8.0.jar;F:\Program Files\repository\org\xerial\snappy\snappy-java\1.1.8.4\snappy-java-1.1.8.4.jar;F:\Program Files\repository\io\micrometer\micrometer-core\1.9.7\micrometer-core-1.9.7.jar;F:\Program Files\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;F:\Program Files\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;F:\Program Files\repository\io\github\resilience4j\resilience4j-circuitbreaker\1.3.0\resilience4j-circuitbreaker-1.3.0.jar;F:\Program Files\repository\io\vavr\vavr\0.10.2\vavr-0.10.2.jar;F:\Program Files\repository\io\vavr\vavr-match\0.10.2\vavr-match-0.10.2.jar;F:\Program Files\repository\io\github\resilience4j\resilience4j-core\1.3.0\resilience4j-core-1.3.0.jar;F:\Program Files\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.4\jackson-annotations-2.13.4.jar;F:\Program Files\repository\com\fasterxml\jackson\core\jackson-core\2.13.4\jackson-core-2.13.4.jar;F:\Program Files\repository\com\esotericsoftware\kryo\5.5.0\kryo-5.5.0.jar;F:\Program Files\repository\com\esotericsoftware\reflectasm\1.11.9\reflectasm-1.11.9.jar;F:\Program Files\repository\com\esotericsoftware\minlog\1.3.1\minlog-1.3.1.jar;F:\Program Files\repository\com\tplink\smb\solution-components-lock-mem\1.3.4\solution-components-lock-mem-1.3.4.jar;F:\Program Files\repository\net\coobird\thumbnailator\0.4.20\thumbnailator-0.4.20.jar;F:\Program Files\repository\com\github\gotson\webp-imageio\0.2.2\webp-imageio-0.2.2.jar;F:\Program Files\repository\org\springframework\spring-test\5.2.12.RELEASE\spring-test-5.2.12.RELEASE.jar;F:\Program Files\repository\org\springframework\spring-core\5.3.25\spring-core-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-jcl\5.3.25\spring-jcl-5.3.25.jar;F:\Program Files\repository\org\mockito\mockito-core\3.7.7\mockito-core-3.7.7.jar;F:\Program Files\repository\net\bytebuddy\byte-buddy\1.12.22\byte-buddy-1.12.22.jar;F:\Program Files\repository\net\bytebuddy\byte-buddy-agent\1.12.22\byte-buddy-agent-1.12.22.jar;F:\Program Files\repository\org\mockito\mockito-inline\3.7.7\mockito-inline-3.7.7.jar;F:\Program Files\repository\org\powermock\powermock-module-junit4\2.0.0\powermock-module-junit4-2.0.0.jar;F:\Program Files\repository\org\powermock\powermock-module-junit4-common\2.0.0\powermock-module-junit4-common-2.0.0.jar;F:\Program Files\repository\org\powermock\powermock-reflect\2.0.0\powermock-reflect-2.0.0.jar;F:\Program Files\repository\org\powermock\powermock-core\2.0.0\powermock-core-2.0.0.jar;F:\Program Files\repository\org\javassist\javassist\3.24.0-GA\javassist-3.24.0-GA.jar;F:\Program Files\repository\junit\junit\4.13.2\junit-4.13.2.jar;F:\Program Files\repository\org\hamcrest\hamcrest-core\2.2\hamcrest-core-2.2.jar;F:\Program Files\repository\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar;F:\Program Files\repository\org\powermock\powermock-api-mockito2\2.0.0\powermock-api-mockito2-2.0.0.jar;F:\Program Files\repository\org\powermock\powermock-api-support\2.0.0\powermock-api-support-2.0.0.jar;F:\Program Files\repository\org\objenesis\objenesis\2.6\objenesis-2.6.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 @w@C:\Users\admin\AppData\Local\Temp\idea_working_dirs_junit.tmp @C:\Users\admin\AppData\Local\Temp\idea_junit.tmp Wanted but not invoked: personSyncEventPublisher.publishGroupDeleteSyncEvent( <any> ); -> at com.tplink.cdd.vms.person.core.port.eventcenter.PersonSyncEventPublisher.publishGroupDeleteSyncEvent(PersonSyncEventPublisher.java:55) However, there was exactly 1 interaction with this mock: personSyncEventPublisher.publishGroupUpdateSyncEvent( GroupUpdateSyncEventDTO(vmsId=vms-123, groupId=689d975cc473cf26b7fcd9b7, addedPersonIdList=[6879f25341daa77212c8a090], removedPersonIdList=[6879f25341daa77212c8a087, 6879f25341daa77212c8a089], notChangedPersonIdList=[6879f25341daa77212c8a088]) ); -> at com.tplink.cdd.vms.person.core.domain.group.UpdateGroupService.updateGroup(UpdateGroupService.java:93) Wanted but not invoked: personSyncEventPublisher.publishGroupDeleteSyncEvent( <any> ); -> at com.tplink.cdd.vms.person.core.port.eventcenter.PersonSyncEventPublisher.publishGroupDeleteSyncEvent(PersonSyncEventPublisher.java:55) However, there was exactly 1 interaction with this mock: personSyncEventPublisher.publishGroupUpdateSyncEvent( GroupUpdateSyncEventDTO(vmsId=vms-123, groupId=689d975cc473cf26b7fcd9b7, addedPersonIdList=[6879f25341daa77212c8a090], removedPersonIdList=[6879f25341daa77212c8a087, 6879f25341daa77212c8a089], notChangedPersonIdList=[6879f25341daa77212c8a088]) ); -> at com.tplink.cdd.vms.person.core.domain.group.UpdateGroupService.updateGroup(UpdateGroupService.java:93) at com.tplink.cdd.vms.person.core.port.eventcenter.PersonSyncEventPublisher.publishGroupDeleteSyncEvent(PersonSyncEventPublisher.java:55) at com.tplink.cdd.vms.person.core.domain.group.UpdateGroupServiceTest.testUpdateGroup_Success_WithPersonChanges(UpdateGroupServiceTest.java:249) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.mockito.internal.runners.DefaultInternalRunner$1$1.evaluate(DefaultInternalRunner.java:54) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:99) at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:105) at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:40) at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163) at org.junit.runners.Suite.runChild(Suite.java:128) at org.junit.runners.Suite.runChild(Suite.java:27) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) 进程已结束,退出代码为 -1
最新发布
08-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值