You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ge...@apache.org on 2018/11/03 14:48:20 UTC

lucene-solr:master: SOLR-12555: Use `expectThrows` for expected exceptions

Repository: lucene-solr
Updated Branches:
  refs/heads/master c5ff4a444 -> f669a1fb0


SOLR-12555: Use `expectThrows` for expected exceptions

This commit replaces the `try { doX(); fail(); }` pattern with the
`expectThrows` test helper, which was created for this purpose.

This commit makes these changes in the core package: `o.a.solr.search`.

Closes #464


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/f669a1fb
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f669a1fb
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f669a1fb

Branch: refs/heads/master
Commit: f669a1fb0e1ff974df93229c41cd397956cb1e9a
Parents: c5ff4a4
Author: Jason Gerlowski <ge...@apache.org>
Authored: Fri Nov 2 17:12:41 2018 -0400
Committer: Jason Gerlowski <ge...@apache.org>
Committed: Sat Nov 3 10:48:16 2018 -0400

----------------------------------------------------------------------
 .../apache/solr/search/QueryEqualityTest.java   |  63 +++----
 .../solr/search/TestCollapseQParserPlugin.java  |  11 +-
 .../solr/search/TestExtendedDismaxParser.java   |  68 ++++----
 .../solr/search/TestFoldingMultitermQuery.java  |   6 +-
 .../org/apache/solr/search/TestLRUCache.java    |   9 +-
 .../org/apache/solr/search/TestQueryTypes.java  |  14 +-
 .../solr/search/TestReRankQParserPlugin.java    |  11 +-
 .../org/apache/solr/search/TestRealTimeGet.java | 167 +++++++------------
 .../apache/solr/search/TestSolr4Spatial.java    |  10 +-
 .../apache/solr/search/TestSolrQueryParser.java |  19 +--
 10 files changed, 148 insertions(+), 230 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f669a1fb/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java b/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
index cabe497..a27ad2da 100644
--- a/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
+++ b/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
@@ -1202,14 +1202,8 @@ public class QueryEqualityTest extends SolrTestCaseJ4 {
     assertFuncEquals("gte(foo_i,2)", "gte(foo_i,2)");
     assertFuncEquals("eq(foo_i,2)", "eq(foo_i,2)");
 
-    boolean equals = false;
-    try {
-      assertFuncEquals("eq(foo_i,2)", "lt(foo_i,2)");
-      equals = true;
-    } catch (AssertionError e) {
-      //expected
-    }
-    assertFalse(equals);
+    expectThrows(AssertionError.class, "expected error, functions are not equal",
+        () -> assertFuncEquals("eq(foo_i,2)", "lt(foo_i,2)"));
   }
 
   public void testChildField() throws Exception {
@@ -1223,32 +1217,25 @@ public class QueryEqualityTest extends SolrTestCaseJ4 {
   }
 
   public void testPayloadScoreQuery() throws Exception {
-    // I don't see a precedent to test query inequality in here, so doing a `try`
     // There was a bug with PayloadScoreQuery's .equals() method that said two queries were equal with different includeSpanScore settings
 
-    try {
-      assertQueryEquals
-          ("payload_score"
-              , "{!payload_score f=foo_dpf v=query func=min includeSpanScore=false}"
-              , "{!payload_score f=foo_dpf v=query func=min includeSpanScore=true}"
-          );
-      fail("queries should not have been equal");
-    } catch(AssertionFailedError e) {
-      assertTrue("queries were not equal, as expected", true);
-    }
+    expectThrows(AssertionFailedError.class, "queries should not have been equal",
+        () -> assertQueryEquals
+            ("payload_score"
+                , "{!payload_score f=foo_dpf v=query func=min includeSpanScore=false}"
+                , "{!payload_score f=foo_dpf v=query func=min includeSpanScore=true}"
+            )
+    );
   }
 
   public void testPayloadCheckQuery() throws Exception {
-    try {
-      assertQueryEquals
-          ("payload_check"
-              , "{!payload_check f=foo_dpf payloads=2}one"
-              , "{!payload_check f=foo_dpf payloads=2}two"
-          );
-      fail("queries should not have been equal");
-    } catch(AssertionFailedError e) {
-      assertTrue("queries were not equal, as expected", true);
-    }
+    expectThrows(AssertionFailedError.class, "queries should not have been equal",
+        () -> assertQueryEquals
+            ("payload_check"
+                , "{!payload_check f=foo_dpf payloads=2}one"
+                , "{!payload_check f=foo_dpf payloads=2}two"
+            )
+    );
   }
 
   public void testPayloadFunction() throws Exception {
@@ -1272,16 +1259,14 @@ public class QueryEqualityTest extends SolrTestCaseJ4 {
             "must='{!lucene}foo_s:c' filter='{!lucene}foo_s:d' filter='{!lucene}foo_s:e'}",
         "{!bool must='{!lucene}foo_s:c' filter='{!lucene}foo_s:d' " +
             "must_not='{!lucene}foo_s:a' should='{!lucene}foo_s:b' filter='{!lucene}foo_s:e'}");
-    try {
-      assertQueryEquals
-          ("bool"
-              , "{!bool must='{!lucene}foo_s:a'}"
-              , "{!bool should='{!lucene}foo_s:a'}"
-          );
-      fail("queries should not have been equal");
-    } catch(AssertionFailedError e) {
-      assertTrue("queries were not equal, as expected", true);
-    }
+
+    expectThrows(AssertionFailedError.class, "queries should not have been equal",
+        () -> assertQueryEquals
+            ("bool"
+                , "{!bool must='{!lucene}foo_s:a'}"
+                , "{!bool should='{!lucene}foo_s:a'}"
+            )
+    );
   }
 
   // Override req to add df param

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f669a1fb/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java b/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java
index 9f65ba5..7a5fd8d 100644
--- a/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java
+++ b/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java
@@ -881,13 +881,10 @@ public class TestCollapseQParserPlugin extends SolrTestCaseJ4 {
 
   public void testGroupHeadSelector() {
     GroupHeadSelector s;
-    
-    try {
-      s = GroupHeadSelector.build(params("sort", "foo_s asc", "min", "bar_s"));
-      fail("no exception with multi criteria");
-    } catch (SolrException e) {
-      // expected
-    }
+
+    expectThrows(SolrException.class, "no exception with multi criteria",
+        () -> GroupHeadSelector.build(params("sort", "foo_s asc", "min", "bar_s"))
+    );
     
     s = GroupHeadSelector.build(params("min", "foo_s"));
     assertEquals(GroupHeadSelectorType.MIN, s.type);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f669a1fb/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java b/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java
index ff9a2c4..0f72b32 100644
--- a/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java
+++ b/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java
@@ -656,45 +656,35 @@ public class TestExtendedDismaxParser extends SolrTestCaseJ4 {
   public void testCyclicAliasing() throws Exception {
     try {
       ignoreException(".*Field aliases lead to a cycle.*");
-      try {
-        h.query(req("defType","edismax", "q","blarg", "qf","who", "f.who.qf","name","f.name.qf","who"));
-        fail("Simple cyclic alising not detected");
-      } catch (SolrException e) {
-        assertTrue(e.getCause().getMessage().contains("Field aliases lead to a cycle"));
-      }
-      
-      try {
-        h.query(req("defType","edismax", "q","blarg", "qf","who", "f.who.qf","name","f.name.qf","myalias", "f.myalias.qf","who"));
-        fail("Cyclic alising not detected");
-      } catch (SolrException e) {
-        assertTrue(e.getCause().getMessage().contains("Field aliases lead to a cycle"));
-      }
-      
-      try {
-        h.query(req("defType","edismax", "q","blarg", "qf","field1", "f.field1.qf","field2 field3","f.field2.qf","field4 field5", "f.field4.qf","field5", "f.field5.qf","field6", "f.field3.qf","field6"));
-      } catch (SolrException e) {
-        assertFalse("This is not cyclic alising", e.getCause().getMessage().contains("Field aliases lead to a cycle"));
-        assertTrue(e.getCause().getMessage().contains("not a valid field name"));
-      }
-      
-      try {
-        h.query(req("defType","edismax", "q","blarg", "qf","field1", "f.field1.qf","field2 field3", "f.field2.qf","field4 field5", "f.field4.qf","field5", "f.field5.qf","field4"));
-        fail("Cyclic alising not detected");
-      } catch (SolrException e) {
-        assertTrue(e.getCause().getMessage().contains("Field aliases lead to a cycle"));
-      }
-      
-      try {
-        h.query(req("defType","edismax", "q","who:(Zapp Pig)", "qf","text", "f.who.qf","name","f.name.qf","myalias", "f.myalias.qf","who"));
-        fail("Cyclic alising not detected");
-      } catch (SolrException e) {
-        assertTrue(e.getCause().getMessage().contains("Field aliases lead to a cycle"));
-      }
+
+      SolrException e = expectThrows(SolrException.class, "Simple cyclic alising not detected",
+          () -> h.query(req("defType","edismax", "q","blarg", "qf","who", "f.who.qf","name","f.name.qf","who")));
+      assertCyclicDetectionErrorMessage(e);
+
+      e = expectThrows(SolrException.class, "Cyclic alising not detected",
+          () -> h.query(req("defType","edismax", "q","blarg", "qf","who", "f.who.qf","name","f.name.qf","myalias", "f.myalias.qf","who")));
+      assertCyclicDetectionErrorMessage(e);
+
+      e = expectThrows(SolrException.class, "Cyclic aliasing not detected", () -> h.query(req("defType","edismax", "q","blarg", "qf","field1", "f.field1.qf","field2 field3","f.field2.qf","field4 field5", "f.field4.qf","field5", "f.field5.qf","field6", "f.field3.qf","field6")));
+      assertFalse("This is not cyclic aliasing", e.getCause().getMessage().contains("Field aliases lead to a cycle"));
+      assertTrue("Should throw exception due to invalid field name", e.getCause().getMessage().contains("not a valid field name"));
+
+      e = expectThrows(SolrException.class, "Cyclic alising not detected",
+          () -> h.query(req("defType","edismax", "q","blarg", "qf","field1", "f.field1.qf","field2 field3", "f.field2.qf","field4 field5", "f.field4.qf","field5", "f.field5.qf","field4")));
+      assertCyclicDetectionErrorMessage(e);
+
+      e = expectThrows(SolrException.class, "Cyclic alising not detected",
+          () -> h.query(req("defType","edismax", "q","who:(Zapp Pig)", "qf","text", "f.who.qf","name","f.name.qf","myalias", "f.myalias.qf","who")));
+      assertCyclicDetectionErrorMessage(e);
     } finally {
       resetExceptionIgnores();
     }
   }
 
+  private void assertCyclicDetectionErrorMessage(SolrException e) {
+    assertTrue(e.getCause().getMessage().contains("Field aliases lead to a cycle"));
+  }
+
   public void testOperatorsWithLiteralColons() {
     assertU(adoc("id", "142", "a_s", "bogus:xxx", "text_s", "yak"));
     assertU(adoc("id", "143", "a_s", "bogus:xxx"));
@@ -2092,8 +2082,8 @@ public class TestExtendedDismaxParser extends SolrTestCaseJ4 {
   public void killInfiniteRecursionParse() throws Exception {
     assertJQ(req("defType", "edismax", "q", "*", "qq", "{!edismax v=something}", "bq", "{!edismax v=$qq}"));
   }
-  
-  /** SOLR-5163 */ 
+
+  /** SOLR-5163 */
   @Test
   public void testValidateQueryFields() throws Exception {
     // field aliasing covered by test - testAliasing
@@ -2103,13 +2093,13 @@ public class TestExtendedDismaxParser extends SolrTestCaseJ4 {
     params.add("q", "olive AND other");
     params.add("qf", "subject^3 title");
     params.add("debugQuery", "true");
-    
+
     // test valid field names
     try (SolrQueryRequest req = req(params)) {
       String response = h.query(req);
       response.contains("+DisjunctionMaxQuery((title:olive | (subject:oliv)^3.0)) +DisjunctionMaxQuery((title:other | (subject:other)^3.0))");
     }
-    
+
     // test invalid field name
     params.set("qf", "subject^3 nosuchfield");
     try (SolrQueryRequest req = req(params)) {
@@ -2117,7 +2107,7 @@ public class TestExtendedDismaxParser extends SolrTestCaseJ4 {
     } catch (Exception e) {
       Assert.assertEquals("org.apache.solr.search.SyntaxError: Query Field 'nosuchfield' is not a valid field name", e.getMessage());
     }
-    
+
   }
 
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f669a1fb/solr/core/src/test/org/apache/solr/search/TestFoldingMultitermQuery.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestFoldingMultitermQuery.java b/solr/core/src/test/org/apache/solr/search/TestFoldingMultitermQuery.java
index 5ceb224..30181e6 100644
--- a/solr/core/src/test/org/apache/solr/search/TestFoldingMultitermQuery.java
+++ b/solr/core/src/test/org/apache/solr/search/TestFoldingMultitermQuery.java
@@ -304,9 +304,9 @@ public class TestFoldingMultitermQuery extends SolrTestCaseJ4 {
   public void testMultiBad() {
     try {
       ignoreException("analyzer returned too many terms");
-      assertQ(req("q", "content_multi_bad:" + "abCD*"));
-      fail("Should throw exception when token evaluates to more than one term");
-    } catch (Exception expected) {
+      Exception expected = expectThrows(Exception.class, "Should throw exception when token evaluates to more than one term",
+          () -> assertQ(req("q", "content_multi_bad:" + "abCD*"))
+      );
       assertTrue(expected.getCause() instanceof org.apache.solr.common.SolrException);
     } finally {
       resetExceptionIgnores();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f669a1fb/solr/core/src/test/org/apache/solr/search/TestLRUCache.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestLRUCache.java b/solr/core/src/test/org/apache/solr/search/TestLRUCache.java
index 3bec6df..934c1ec 100644
--- a/solr/core/src/test/org/apache/solr/search/TestLRUCache.java
+++ b/solr/core/src/test/org/apache/solr/search/TestLRUCache.java
@@ -182,11 +182,8 @@ public class TestLRUCache extends LuceneTestCase {
     CacheRegenerator cr = new NoOpRegenerator();
     Object o = cache.init(params, null, cr);
 
-    try {
-      cache.put("1", "1");
-      fail("Adding a non-accountable value to a cache configured with maxRamBytes should have failed");
-    } catch (Exception e) {
-      assertEquals(e.getClass(), SolrException.class);
-    }
+    expectThrows(SolrException.class, "Adding a non-accountable value to a cache configured with maxRamBytes should have failed",
+        () -> cache.put("1", "1")
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f669a1fb/solr/core/src/test/org/apache/solr/search/TestQueryTypes.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestQueryTypes.java b/solr/core/src/test/org/apache/solr/search/TestQueryTypes.java
index 477468a..29c9a37 100644
--- a/solr/core/src/test/org/apache/solr/search/TestQueryTypes.java
+++ b/solr/core/src/test/org/apache/solr/search/TestQueryTypes.java
@@ -389,17 +389,17 @@ public class TestQueryTypes extends SolrTestCaseJ4 {
 
     try {
       ignoreException("No\\ default\\, and no switch case");
-      assertQ("no match and no default",
+      RuntimeException exp = expectThrows(RuntimeException.class, "Should have gotten an error w/o default",
+          () -> assertQ("no match and no default",
               req("q", "{!switch case.x=Dude case.z=Yonik}asdf")
-              ,"//result[@numFound='BOGUS']");
-      fail("Should have gotten an error w/o default");
-    } catch (RuntimeException exp) {
-      assertTrue("exp cause is wrong", 
-                 exp.getCause() instanceof SolrException);
+              , "//result[@numFound='BOGUS']")
+      );
+      assertTrue("exp cause is wrong",
+          exp.getCause() instanceof SolrException);
       SolrException e = (SolrException) exp.getCause();
       assertEquals("error isn't user error", 400, e.code());
       assertTrue("Error doesn't include bad switch case: " + e.getMessage(),
-                 e.getMessage().contains("asdf"));
+          e.getMessage().contains("asdf"));
     } finally {
       resetExceptionIgnores();
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f669a1fb/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java b/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java
index 129516e..b3e01f2 100644
--- a/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java
+++ b/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java
@@ -598,12 +598,11 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
     params.add("start", "0");
     params.add("rows", "2");
 
-    try {
-      h.query(req(params));
-      fail("A syntax error should be thrown when "+ReRankQParserPlugin.RERANK_QUERY+" parameter is not specified");
-    } catch (SolrException e) {
-      assertTrue(e.code() == SolrException.ErrorCode.BAD_REQUEST.code);
-    }
+    SolrException se = expectThrows(SolrException.class, "A syntax error should be thrown when "+ReRankQParserPlugin.RERANK_QUERY+" parameter is not specified",
+        () -> h.query(req(params))
+    );
+    assertTrue(se.code() == SolrException.ErrorCode.BAD_REQUEST.code);
+
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f669a1fb/solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java b/solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java
index 69d34f6..ec1b422 100644
--- a/solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java
+++ b/solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java
@@ -335,76 +335,53 @@ public class TestRealTimeGet extends TestRTGBase {
     clearIndex();
     assertU(commit());
 
-    long version = addAndGetVersion(sdoc("id","1") , null);
+    final long version = addAndGetVersion(sdoc("id","1") , null);
     long version2;
 
-    try {
-      // try version added directly on doc
-      version2 = addAndGetVersion(sdoc("id","1", "_version_", Long.toString(version-1)), null);
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    // try version added directly on doc
+    SolrException se = expectThrows(SolrException.class, "version should cause an error",
+        () -> addAndGetVersion(sdoc("id","1", "_version_", Long.toString(version-1)), null));
+    assertEquals("version should cause a conflict", 409, se.code());
 
-    try {
-      // try version added as a parameter on the request
-      version2 = addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(version-1)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    // try version added as a parameter on the request
+    se = expectThrows(SolrException.class, "version should cause an error",
+        () -> addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(version-1))));
+    assertEquals("version should cause a conflict", 409, se.code());
 
-    try {
-      // try an add specifying a negative version
-      version2 = addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(-version)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    // try an add specifying a negative version
+    se = expectThrows(SolrException.class, "negative version should cause a conflict",
+        () -> addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(-version))));
+    assertEquals("version should cause a conflict", 409, se.code());
 
-    try {
-      // try an add with a greater version
-      version2 = addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(version+random().nextInt(1000)+1)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    // try an add with a greater version
+    se = expectThrows(SolrException.class, "greater version should cause a conflict",
+        () -> addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(version+random().nextInt(1000)+1))));
+    assertEquals("version should cause a conflict", 409, se.code());
 
     //
     // deletes
     //
 
-    try {
-      // try a delete with version on the request
-      version2 = deleteAndGetVersion("1", params("_version_", Long.toString(version-1)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    // try a delete with version on the request
+    se = expectThrows(SolrException.class, "version should cause an error",
+        () -> deleteAndGetVersion("1", params("_version_", Long.toString(version-1))));
+    assertEquals("version should cause a conflict", 409, se.code());
 
-    try {
-      // try a delete with a negative version
-      version2 = deleteAndGetVersion("1", params("_version_", Long.toString(-version)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    // try a delete with a negative version
+    se = expectThrows(SolrException.class, "negative version should cause an error",
+        () -> deleteAndGetVersion("1", params("_version_", Long.toString(-version))));
+    assertEquals("version should cause a conflict", 409, se.code());
 
-    try {
-      // try a delete with a greater version
-      version2 = deleteAndGetVersion("1", params("_version_", Long.toString(version+random().nextInt(1000)+1)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    // try a delete with a greater version
+    se = expectThrows(SolrException.class, "greater version should cause an error",
+        () -> deleteAndGetVersion("1", params("_version_", Long.toString(version+random().nextInt(1000)+1))));
+    assertEquals("version should cause a conflict", 409, se.code());
+
+    // try a delete of a document that doesn't exist, specifying a specific version
+    se = expectThrows(SolrException.class, "document does not exist should cause an error",
+        () -> deleteAndGetVersion("I_do_not_exist", params("_version_", Long.toString(version))));
+    assertEquals("version should cause a conflict", 409, se.code());
 
-    try {
-      // try a delete of a document that doesn't exist, specifying a specific version
-      version2 = deleteAndGetVersion("I_do_not_exist", params("_version_", Long.toString(version)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
 
     // try a delete of a document that doesn't exist, specifying that it should not
     version2 = deleteAndGetVersion("I_do_not_exist", params("_version_", Long.toString(-1)));
@@ -414,56 +391,44 @@ public class TestRealTimeGet extends TestRTGBase {
     version2 = addAndGetVersion(sdoc("id","1", "_version_", Long.toString(version)), null);
     assertTrue(version2 > version);
 
-    try {
-      // overwriting the previous version should now fail
-      version2 = addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(version)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    // overwriting the previous version should now fail
+    se = expectThrows(SolrException.class, "overwriting previous version should fail",
+        () -> addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(version))));
+    assertEquals(409, se.code());
 
-    try {
-      // deleting the previous version should now fail
-      version2 = deleteAndGetVersion("1", params("_version_", Long.toString(version)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    // deleting the previous version should now fail
+    se = expectThrows(SolrException.class, "deleting the previous version should now fail",
+        () -> deleteAndGetVersion("1", params("_version_", Long.toString(version))));
+    assertEquals(409, se.code());
 
-    version = version2;
+    final long prevVersion = version2;
 
     // deleting the current version should work
-    version2 = deleteAndGetVersion("1", params("_version_", Long.toString(version)));
-
-    try {
-      // overwriting the previous existing doc should now fail (since it was deleted)
-      version2 = addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(version)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    version2 = deleteAndGetVersion("1", params("_version_", Long.toString(prevVersion)));
 
-    try {
-      // deleting the previous existing doc should now fail (since it was deleted)
-      version2 = deleteAndGetVersion("1", params("_version_", Long.toString(version)));
-      fail();
-    } catch (SolrException se) {
-      assertEquals(409, se.code());
-    }
+    // overwriting the previous existing doc should now fail (since it was deleted)
+    se = expectThrows(SolrException.class, "overwriting the previous existing doc should now fail (since it was deleted)",
+        () -> addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(prevVersion))));
+    assertEquals(409, se.code());
+
+    // deleting the previous existing doc should now fail (since it was deleted)
+    se = expectThrows(SolrException.class, "deleting the previous existing doc should now fail (since it was deleted)",
+        () -> deleteAndGetVersion("1", params("_version_", Long.toString(prevVersion))));
+    assertEquals(409, se.code());
 
     // overwriting a negative version should work
-    version2 = addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(-(version-1))));
+    version2 = addAndGetVersion(sdoc("id","1"), params("_version_", Long.toString(-(prevVersion-1))));
     assertTrue(version2 > version);
-    version = version2;
+    long lastVersion = version2;
 
     // sanity test that we see the right version via rtg
     assertJQ(req("qt","/get","id","1")
-        ,"=={'doc':{'id':'1','_version_':" + version + "}}"
+        ,"=={'doc':{'id':'1','_version_':" + lastVersion + "}}"
     );
   }
 
 
-    /***
+  /***
     @Test
     public void testGetRealtime() throws Exception {
       SolrQueryRequest sr1 = req("q","foo");
@@ -626,12 +591,9 @@ public class TestRealTimeGet extends TestRTGBase {
                   if (correct) {
                     version = deleteAndGetVersion(Integer.toString(id), params("_version_", Long.toString(info.version)));
                   } else {
-                    try {
-                      version = deleteAndGetVersion(Integer.toString(id), params("_version_", Long.toString(badVersion)));
-                      fail();
-                    } catch (SolrException se) {
-                      assertEquals(409, se.code());
-                    }
+                    SolrException se = expectThrows(SolrException.class, "should not get random version",
+                        () -> deleteAndGetVersion(Integer.toString(id), params("_version_", Long.toString(badVersion))));
+                    assertEquals(409, se.code());
                   }
                 } else {
                   version = deleteAndGetVersion(Integer.toString(id), null);
@@ -674,12 +636,9 @@ public class TestRealTimeGet extends TestRTGBase {
                   if (correct) {
                     version = addAndGetVersion(sd, params("_version_", Long.toString(info.version)));
                   } else {
-                    try {
-                      version = addAndGetVersion(sd, params("_version_", Long.toString(badVersion)));
-                      fail();
-                    } catch (SolrException se) {
-                      assertEquals(409, se.code());
-                    }
+                    SolrException se = expectThrows(SolrException.class, "should not get bad version",
+                        () -> addAndGetVersion(sd, params("_version_", Long.toString(badVersion))));
+                    assertEquals(409, se.code());
                   }
                 } else {
                   version = addAndGetVersion(sd, null);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f669a1fb/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial.java b/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial.java
index 7a8c06a..7722664 100644
--- a/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial.java
+++ b/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial.java
@@ -83,12 +83,10 @@ public class TestSolr4Spatial extends SolrTestCaseJ4 {
         "fq", "{!field f=" + fieldName + "}Intersectssss"), 400);
 
     ignoreException("NonexistentShape");
-    try {
-      assertU(adoc("id", "-1", fieldName, "NonexistentShape"));
-      fail();
-    } catch (SolrException e) {
-      assertEquals(400, e.code());
-    }
+    SolrException e = expectThrows(SolrException.class, "should throw exception on non existent shape",
+        () -> assertU(adoc("id", "-1", fieldName, "NonexistentShape"))
+    );
+    assertEquals(400, e.code());
     unIgnoreException("NonexistentShape");
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f669a1fb/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java b/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java
index 37347b3..4920520 100644
--- a/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java
+++ b/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java
@@ -353,13 +353,10 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
     String q = sb.toString();
 
     // This will still fail when used as the main query, but will pass in a filter query since TermsQuery can be used.
-    try {
+    {
       ignoreException("Too many clauses");
-      assertJQ(req("q",q)
-          ,"/response/numFound==6");
-      fail();
-    } catch (Exception e) {
-      // expect "too many clauses" exception... see SOLR-10921
+      SolrException e = expectThrows(SolrException.class, "exoected too many clauses exception",
+          () -> assertJQ(req("q", q), "/response/numFound==6"));
       assertTrue(e.getMessage().contains("many clauses"));
     }
 
@@ -1114,13 +1111,9 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
     for (String suffix:fieldSuffix) {
       qParser = QParser.getParser("foo_" + suffix + ":(1 2 3 4 5 6 7 8 9 10 20 19 18 17 16 15 14 13 12 NOT_A_NUMBER)", req);
       qParser.setIsFilter(true); // this may change in the future
-      try {
-        qParser.getQuery();
-        fail("Expecting exception");
-      } catch (SolrException e) {
-        assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
-        assertTrue("Unexpected exception: " + e.getMessage(), e.getMessage().contains("Invalid Number: NOT_A_NUMBER"));
-      }
+      SolrException e = expectThrows(SolrException.class, "Expecting exception", qParser::getQuery);
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
+      assertTrue("Unexpected exception: " + e.getMessage(), e.getMessage().contains("Invalid Number: NOT_A_NUMBER"));
     }