function expectPatchStart(iIndex, oGroupLock, sProperty, sOldValue, sNewValue) {
				oCacheMock.expects("fetchValue")
					.withExactArgs(sinon.match.same(_GroupLock.$cached), sEntityPath)
					.returns(SyncPromise.resolve(oEntity));
				oHelperMock.expects("buildPath").withExactArgs(sEntityPath, "Address/" + sProperty)
					.returns(sEntityPath + "/Address/" + sProperty);
				oHelperMock.expects("makeUpdateData")
					.withExactArgs(["Address", sProperty], sNewValue)
					.returns("~oUpdateData~" + iIndex);
				oHelperMock.expects("makeUpdateData")
					.withExactArgs(["Address", sProperty], sOldValue)
					.returns("~oOldData~" + iIndex);
				that.mock(oGroupLock).expects("getGroupId").withExactArgs().returns("group");
				that.oRequestorMock.expects("buildQueryString")
					.withExactArgs("/BusinessPartnerList", sinon.match.same(mQueryOptions), true)
					.returns("?foo=bar");
				oHelperMock.expects("updateAll")
					.withExactArgs(sinon.match.same(oCache.mChangeListeners), sEntityPath,
						sinon.match.same(oEntity), "~oUpdateData~" + iIndex);
			}
******************************************************************************************
	[false, true].forEach(function (bTransient) {
		["EUR", "", undefined].forEach(function (sUnitOrCurrencyValue, i) {
			QUnit.test("_Cache#update: updates unit, " + bTransient + ", " + i, function (assert) {
				var mQueryOptions = {},
					oCache = new _Cache(this.oRequestor, "ProductList", mQueryOptions, true),
					oCacheMock = this.mock(oCache),
					oEntity = {
						"@odata.etag" : 'W/"19700101000000.0000000"',
						ProductInfo : {
							Amount : "123"
						}
					},
					fnError = this.spy(),
					oGroupLock = {
						getGroupId : function () {},
						unlock : function () {}
					},
					oHelperMock = this.mock(_Helper),
					oPatchResult = {},
					oPatchPromise = Promise.resolve(oPatchResult),
					oPostBody = {},
					oUnitUpdateData = {},
					oUpdateData = {};

				if (bTransient) {
					_Helper.setPrivateAnnotation(oEntity, "postBody", oPostBody);
					_Helper.setPrivateAnnotation(oEntity, "transient", "group");
				}
				oCache.fetchValue = function () {};
				oCacheMock.expects("fetchValue")
					.withExactArgs(sinon.match.same(_GroupLock.$cached), "path/to/entity")
					.returns(SyncPromise.resolve(oEntity));
				this.mock(oGroupLock).expects("getGroupId").withExactArgs().returns("group");
				oHelperMock.expects("deleteUpdating")
					.withExactArgs("ProductInfo/Amount", sinon.match.same(oEntity));
				oHelperMock.expects("makeUpdateData")
					.withExactArgs(["ProductInfo", "Amount"], "123")
					.returns(oUpdateData);
				oHelperMock.expects("updateAll")
					.withExactArgs(sinon.match.same(oCache.mChangeListeners), "path/to/entity",
						sinon.match.same(oEntity), sinon.match.same(oUpdateData));
				if (bTransient) {
					oHelperMock.expects("updateAll").withExactArgs({}, "path/to/entity",
						sinon.match.same(oPostBody), sinon.match.same(oUpdateData));
				}
				oHelperMock.expects("makeUpdateData")
					.withExactArgs(["ProductInfo", "Amount"], "123")
					.returns("n/a"); // not used in this test
				oCacheMock.expects("getValue")
					.withExactArgs("path/to/entity/ProductInfo/Pricing/Currency")
					.returns(sUnitOrCurrencyValue);
				if (sUnitOrCurrencyValue === undefined) {
					this.oLogMock.expects("debug").withExactArgs("Missing value for unit of measure"
							+ " path/to/entity/ProductInfo/Pricing/Currency"
							+ " when updating path/to/entity/ProductInfo/Amount",
						oCache.toString(),
						sClassName);
				} else {
					oHelperMock.expects("makeUpdateData")
						.withExactArgs(["ProductInfo", "Pricing", "Currency"], sUnitOrCurrencyValue)
						.returns(oUnitUpdateData);
					oHelperMock.expects("merge")
						.withExactArgs(sinon.match.same(bTransient ? oPostBody : oUpdateData),
							sinon.match.same(oUnitUpdateData));
				}
				if (bTransient) {
					this.mock(oGroupLock).expects("unlock").withExactArgs();
				} else {
					this.oRequestorMock.expects("buildQueryString")
						.withExactArgs("/ProductList", sinon.match.same(mQueryOptions), true)
						.returns("");
					this.oRequestorMock.expects("request")
						.withExactArgs("PATCH", "ProductList('0')", sinon.match.same(oGroupLock),
							{"If-Match" : sinon.match.same(oEntity)}, sinon.match.same(oUpdateData),
							sinon.match.func, sinon.match.func, undefined,
							oCache.sResourcePath + "/path/to/entity", undefined, undefined,
							undefined, sinon.match.func)
						.returns(oPatchPromise);
					oPatchPromise.then(function () {
						oHelperMock.expects("updateExisting")
							.withExactArgs(sinon.match.same(oCache.mChangeListeners),
								"path/to/entity", sinon.match.same(oEntity),
								sinon.match.same(oPatchResult));
					});
				}

				// code under test
				return oCache.update(oGroupLock, "ProductInfo/Amount", "123", fnError,
						"ProductList('0')", "path/to/entity", "Pricing/Currency", false, null,
						null, /*fnSetUpsertPromise