Skip to content

Commit c33b1cb

Browse files
committed
Improving Unit test coverage
1 parent 64cc223 commit c33b1cb

File tree

7 files changed

+144
-43
lines changed

7 files changed

+144
-43
lines changed

pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
<properties>
4040
<spring.version>5.0.1.RELEASE</spring.version>
4141
<spring-data.version>Kay-SR1</spring-data.version>
42-
<artifact.selectedVersion.minorVersion>0</artifact.selectedVersion.minorVersion>
4342

4443
<hibernate-validator.version>5.2.4.Final</hibernate-validator.version>
4544
<aws-java-sdk.version>1.11.232</aws-java-sdk.version>

src/main/java/org/socialsignin/spring/data/dynamodb/core/DynamoDBTemplate.java

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,12 @@
4040
import org.springframework.context.ApplicationContext;
4141
import org.springframework.context.ApplicationContextAware;
4242
import org.springframework.context.ApplicationEventPublisher;
43+
import org.springframework.lang.Nullable;
4344
import org.springframework.util.Assert;
4445

4546
import java.util.List;
4647
import java.util.Map;
48+
import java.util.function.Function;
4749

4850
public class DynamoDBTemplate implements DynamoDBOperations, ApplicationContextAware {
4951

@@ -109,7 +111,7 @@ public <T> int count(Class<T> domainClass,
109111
public <T> PaginatedQueryList<T> query(Class<T> domainClass,
110112
DynamoDBQueryExpression<T> queryExpression) {
111113
PaginatedQueryList<T> results = dynamoDBMapper.query(domainClass, queryExpression);
112-
maybeEmitEvent(new AfterQueryEvent<T>(results));
114+
maybeEmitEvent(results, AfterQueryEvent::new);
113115
return results;
114116
}
115117

@@ -122,28 +124,24 @@ public <T> int count(Class<T> domainClass,
122124
@Override
123125
public <T> T load(Class<T> domainClass, Object hashKey, Object rangeKey) {
124126
T entity = dynamoDBMapper.load(domainClass, hashKey,rangeKey);
125-
if (entity != null)
126-
{
127-
maybeEmitEvent(new AfterLoadEvent<>(entity));
128-
}
127+
maybeEmitEvent(entity, AfterLoadEvent::new);
128+
129129
return entity;
130130
}
131131

132132
@Override
133133
public <T> T load(Class<T> domainClass, Object hashKey) {
134134
T entity = dynamoDBMapper.load(domainClass, hashKey);
135-
if (entity != null)
136-
{
137-
maybeEmitEvent(new AfterLoadEvent<>(entity));
138-
}
135+
maybeEmitEvent(entity, AfterLoadEvent::new);
136+
139137
return entity;
140138
}
141139

142140
@Override
143141
public <T> PaginatedScanList<T> scan(Class<T> domainClass,
144142
DynamoDBScanExpression scanExpression) {
145143
PaginatedScanList<T> results = dynamoDBMapper.scan(domainClass, scanExpression);
146-
maybeEmitEvent(new AfterScanEvent<T>(results));
144+
maybeEmitEvent(results, AfterScanEvent::new);
147145
return results;
148146
}
149147

@@ -154,45 +152,45 @@ public Map<String, List<Object>> batchLoad(Map<Class<?>, List<KeyPair>> itemsToG
154152
{
155153
for (Object entity : resultList)
156154
{
157-
maybeEmitEvent(new AfterLoadEvent<Object>(entity));
155+
maybeEmitEvent(entity, AfterLoadEvent::new);
158156
}
159157
}
160158
return results;
161159
}
162160

163161
@Override
164162
public void save(Object entity) {
165-
maybeEmitEvent(new BeforeSaveEvent<>(entity));
163+
maybeEmitEvent(entity, BeforeSaveEvent::new);
166164
dynamoDBMapper.save(entity);
167-
maybeEmitEvent(new AfterSaveEvent<>(entity));
165+
maybeEmitEvent(entity, AfterSaveEvent::new);
168166

169167
}
170168

171169
@Override
172170
public List<FailedBatch> batchSave(Iterable<?> entities) {
173-
entities.forEach(it -> maybeEmitEvent(new BeforeSaveEvent<>(it)));
171+
entities.forEach(it -> maybeEmitEvent(it, BeforeSaveEvent::new));
174172

175173
List<FailedBatch> result = dynamoDBMapper.batchSave(entities);
176174

177-
entities.forEach(it -> maybeEmitEvent(new AfterSaveEvent<>(it)));
175+
entities.forEach(it -> maybeEmitEvent(it, AfterSaveEvent::new));
178176
return result;
179177
}
180178

181179
@Override
182180
public void delete(Object entity) {
183-
maybeEmitEvent(new BeforeDeleteEvent<>(entity));
181+
maybeEmitEvent(entity, BeforeDeleteEvent::new);
184182
dynamoDBMapper.delete(entity);
185-
maybeEmitEvent(new AfterDeleteEvent<>(entity));
183+
maybeEmitEvent(entity, AfterDeleteEvent::new);
186184

187185
}
188186

189187
@Override
190188
public List<FailedBatch> batchDelete(Iterable<?> entities) {
191-
entities.forEach(it -> maybeEmitEvent(new BeforeDeleteEvent<>(it)));
189+
entities.forEach(it -> maybeEmitEvent(it, BeforeDeleteEvent::new));
192190

193191
List<FailedBatch> result = dynamoDBMapper.batchDelete(entities);
194192

195-
entities.forEach(it -> maybeEmitEvent(new AfterDeleteEvent<>(it)));
193+
entities.forEach(it -> maybeEmitEvent(it, AfterDeleteEvent::new));
196194
return result;
197195
}
198196

@@ -243,11 +241,14 @@ public <T> DynamoDBMapperTableModel<T> getTableModel(Class<T> domainClass) {
243241
return dynamoDBMapper.getTableModel(domainClass, dynamoDBMapperConfig);
244242
}
245243

246-
protected <T> void maybeEmitEvent(DynamoDBMappingEvent<T> event) {
247-
if (null != eventPublisher) {
248-
eventPublisher.publishEvent(event);
244+
protected <T> void maybeEmitEvent(@Nullable T source, Function<T, DynamoDBMappingEvent<T>> factory) {
245+
if (eventPublisher != null) {
246+
if (source != null) {
247+
DynamoDBMappingEvent<T> event = factory.apply(source);
248+
249+
eventPublisher.publishEvent(event);
250+
}
249251
}
250-
}
251252

252-
253+
}
253254
}

src/main/java/org/socialsignin/spring/data/dynamodb/mapping/event/AbstractDynamoDBEventListener.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,29 +82,33 @@ public void onApplicationEvent(DynamoDBMappingEvent<?> event) {
8282
if (event instanceof AfterScanEvent) {
8383

8484
publishEachElement((PaginatedScanList<?>)source, this::onAfterScan);
85-
85+
return;
8686
} else if (event instanceof AfterQueryEvent) {
8787

8888
publishEachElement((PaginatedQueryList<?>)source, this::onAfterQuery);
89+
return;
8990
}
9091
// Check for matching domain type and invoke callbacks
9192
else if (domainClass.isAssignableFrom(source.getClass())) {
9293
if (event instanceof BeforeSaveEvent) {
9394
onBeforeSave(source);
95+
return;
9496
} else if (event instanceof AfterSaveEvent) {
9597
onAfterSave(source);
98+
return;
9699
} else if (event instanceof BeforeDeleteEvent) {
97100
onBeforeDelete(source);
101+
return;
98102
} else if (event instanceof AfterDeleteEvent) {
99103
onAfterDelete(source);
104+
return;
100105
} else if (event instanceof AfterLoadEvent) {
101106
onAfterLoad(source);
102-
} else {
103-
assert false;
107+
return;
104108
}
105-
} else {
106-
assert false;
107109
}
110+
// we should never end up here
111+
assert false;
108112
}
109113

110114
@SuppressWarnings("unchecked")

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCreator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323
import org.springframework.data.repository.query.parser.PartTree;
2424

2525
public class DynamoDBQueryCreator<T,ID> extends AbstractDynamoDBQueryCreator<T, ID,T> {
26-
26+
/*
2727
public DynamoDBQueryCreator(PartTree tree,
2828
DynamoDBEntityInformation<T, ID> entityMetadata,
2929
DynamoDBOperations dynamoDBOperations) {
3030
super(tree, entityMetadata, dynamoDBOperations);
3131
}
32-
32+
*/
3333
public DynamoDBQueryCreator(PartTree tree,
3434
ParameterAccessor parameterAccessor,
3535
DynamoDBEntityInformation<T, ID> entityMetadata,

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryLookupStrategy.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,7 @@ protected <T, ID> RepositoryQuery createDynamoDBQuery(Method method, RepositoryM
146146
Class<T> entityClass, Class<ID> idClass, NamedQueries namedQueries) {
147147
try {
148148
return strategy.createDynamoDBQuery(method, metadata, factory, entityClass, idClass, namedQueries);
149-
} catch (IllegalStateException e) {
150-
return createStrategy.createDynamoDBQuery(method, metadata, factory, entityClass, idClass, namedQueries);
151-
} catch (UnsupportedOperationException e) {
149+
} catch (IllegalStateException | UnsupportedOperationException e) {
152150
return createStrategy.createDynamoDBQuery(method, metadata, factory, entityClass, idClass, namedQueries);
153151
}
154152

src/test/java/org/socialsignin/spring/data/dynamodb/core/DynamoDBTemplateUnitTest.java renamed to src/test/java/org/socialsignin/spring/data/dynamodb/core/DynamoDBTemplateTest.java

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
2020
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
2121
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig.TableNameResolver;
22+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
23+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
2224
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
2325

2426
import org.junit.Assert;
@@ -39,9 +41,12 @@
3941

4042
import static org.junit.Assert.assertEquals;
4143
import static org.junit.Assert.assertTrue;
44+
import static org.mockito.ArgumentMatchers.any;
45+
import static org.mockito.Mockito.mock;
46+
import static org.mockito.Mockito.verify;
4247

4348
@RunWith(MockitoJUnitRunner.class)
44-
public class DynamoDBTemplateUnitTest {
49+
public class DynamoDBTemplateTest {
4550
@Rule
4651
public ExpectedException expectedException = ExpectedException.none();
4752
@Mock
@@ -85,24 +90,54 @@ public void testConstructorOptionalPreconfiguredDynamoDBMapper() {
8590
assertTrue("The constructor should not fail with an assert error", true);
8691
}
8792

88-
@SuppressWarnings("unchecked")
93+
@Test
94+
public void testDelete() {
95+
User user = new User();
96+
dynamoDBTemplate.delete(user);
97+
98+
verify(dynamoDBMapper).delete(user);
99+
}
100+
89101
@Test
90102
public void testBatchDelete_CallsCorrectDynamoDBMapperMethod()
91103
{
92104
List<User> users = new ArrayList<>();
93105
dynamoDBTemplate.batchDelete(users);
94-
Mockito.verify(dynamoDBMapper).batchDelete(Mockito.any(List.class));
106+
verify(dynamoDBMapper).batchDelete(any(List.class));
95107
}
96-
97-
@SuppressWarnings("unchecked")
108+
109+
@Test
110+
public void testSave() {
111+
User user = new User();
112+
dynamoDBTemplate.save(user);
113+
114+
verify(dynamoDBMapper).save(user);
115+
}
116+
98117
@Test
99118
public void testBatchSave_CallsCorrectDynamoDBMapperMethod()
100119
{
101120
List<User> users = new ArrayList<>();
102121
dynamoDBTemplate.batchSave(users);
103-
Mockito.verify(dynamoDBMapper).batchSave(Mockito.any(List.class));
122+
verify(dynamoDBMapper).batchSave(any(List.class));
104123
}
105-
124+
125+
@Test
126+
public void testCountQuery() {
127+
DynamoDBQueryExpression<User> query = mock(DynamoDBQueryExpression.class);
128+
int actual = dynamoDBTemplate.count(User.class, query);
129+
130+
verify(dynamoDBMapper).count(User.class, query);
131+
}
132+
133+
@Test
134+
public void testCountScan() {
135+
DynamoDBScanExpression scan = mock(DynamoDBScanExpression.class);
136+
int actual = dynamoDBTemplate.count(User.class, scan);
137+
138+
verify(dynamoDBMapper).count(User.class, scan);
139+
}
140+
106141
@Test
107142
public void testGetOverriddenTableName_WhenConfigIsNull()
108143
{
@@ -120,7 +155,7 @@ public void testGetOverriddenTableName()
120155
@Test
121156
public void testGetOverriddenTableName_WithTableNameResolver()
122157
{
123-
TableNameResolver tableNameResolver = Mockito.mock(TableNameResolver.class);
158+
TableNameResolver tableNameResolver = mock(TableNameResolver.class);
124159
Mockito.when(tableNameResolver.getTableName(Object.class, dynamoDBMapperConfig)).thenReturn(
125160
"someOtherTableName");
126161
Mockito.when(dynamoDBMapperConfig.getTableNameResolver()).thenReturn(tableNameResolver);
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* Copyright © 2013 spring-data-dynamodb (https://github.com/derjust/spring-data-dynamodb)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.socialsignin.spring.data.dynamodb.repository.query;
17+
18+
import org.junit.Rule;
19+
import org.junit.Test;
20+
import org.junit.rules.ExpectedException;
21+
import org.junit.runner.RunWith;
22+
import org.mockito.Mock;
23+
import org.mockito.junit.MockitoJUnitRunner;
24+
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
25+
import org.springframework.data.repository.query.QueryLookupStrategy;
26+
import org.springframework.data.repository.query.QueryLookupStrategy.Key;
27+
28+
import static org.junit.Assert.assertNotNull;
29+
import static org.junit.Assert.assertSame;
30+
31+
@RunWith(MockitoJUnitRunner.class)
32+
public class DynamoDBQueryLookupStrategyTest {
33+
@Rule
34+
public ExpectedException expectedException = ExpectedException.none();
35+
@Mock
36+
private DynamoDBOperations dynamoDBOperations;
37+
38+
@Test
39+
public void testCreate() {
40+
QueryLookupStrategy actual;
41+
actual = DynamoDBQueryLookupStrategy.create(dynamoDBOperations, Key.CREATE);
42+
assertNotNull(actual);
43+
44+
actual = DynamoDBQueryLookupStrategy.create(dynamoDBOperations, Key.CREATE_IF_NOT_FOUND);
45+
assertNotNull(actual);
46+
}
47+
48+
@Test
49+
public void testNull() {
50+
QueryLookupStrategy actualNull = DynamoDBQueryLookupStrategy.create(dynamoDBOperations, null);
51+
QueryLookupStrategy actualCreate = DynamoDBQueryLookupStrategy.create(dynamoDBOperations, Key.CREATE);
52+
53+
assertSame(actualNull.getClass(), actualCreate.getClass());
54+
}
55+
56+
@Test
57+
public void testDeclaredQuery() {
58+
expectedException.expect(IllegalArgumentException.class);
59+
expectedException.expectMessage("Unsupported query lookup strategy USE_DECLARED_QUERY!");
60+
61+
DynamoDBQueryLookupStrategy.create(dynamoDBOperations, Key.USE_DECLARED_QUERY);
62+
}
63+
64+
}

0 commit comments

Comments
 (0)